Заставить отрицательное vspace вести себя

Заставить отрицательное vspace вести себя

Мой код TeX (включая параметры в определениях команд), который создает листы с текстами песен и листы аккордов песен, генерируется динамически другим кодом, который обращается к данным базы данных и обрабатывает их построчно, поэтому мой урезанный MWE может показаться странным, но потерпите меня.

Цель фрагмента кода, который вы видите, заключается в том, что в дополнение к базовому межстрочному интервалу, связанному с двумя размерами шрифта (что имеет значение при переносе строк), для ясности между каждым «абзацем» (строкой текста) ставится дополнительный 0,3em. Однако всякий раз, когда строка ромадзи следует сразу за строкой японского текста, мне не нужен этот дополнительный parskip, поэтому я пытаюсь отменить его с помощью \vspaceотрицательного значения того же размера. Пока все хорошо — следующий файл работает:

\documentclass{ujarticle}
\usepackage[a4paper, margin=6mm]{geometry}
\usepackage{needspace}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\newcommand{\romaji}[1]{\begingroup\fontsize{10}{11.5}\selectfont
  {#1}\endgroup}
\newenvironment{stanza}
{
  \vspace{1em}
  \setlength{\parskip}{0.3em}
  \fontsize{12}{13.5}\selectfont
  \begin{samepage}
}
{
  \end{samepage}
}            

\begin{document}
\sffamily
\gtfamily
\raggedright
\raggedbottom
\pagestyle{empty}

\begin{stanza}
賛美して目を向けてる あなたに\par
\vspace{-0.3em}\nopagebreak
\romaji{sambi\ shite\ me\ o\ muketeru,\ anata\ ni\par}
\nopagebreak
もとめて待ち望んでる あなたを\par
\vspace{-0.3em}\nopagebreak
\romaji{motomete\ machi\ nozonderu,\ anata\ o\par}
\end{stanza}

\end{document}

Но когда добавляется стиль для ромадзи (в моем тестовом случае курсив), он ломается, и я получаю огромный кусок дополнительного пространства. Единственное различие между левым и правым скриншотами ниже — это добавление \textit{...}в определение команды ромадзи:

\newcommand{\romaji}[1]{\begingroup\fontsize{10}{11.5}\selectfont
  \textit{{#1}}\endgroup}

Вот результат этих двух экспериментов:

таинственный интервал http://l4jp.com/tmp/TeX-tests.png

Жалоба в файле журнала следующая:

Runaway argument?
{{sambi\ shite\ me\ o\ muketeru,\ anata\ ni !
Paragraph ended before \text@command was complete.

Это имеет смысл, но я получаю эту ошибку только когда \textit{}есть - возможно, парсер не может перемещаться по двойным скобкам? Перемещение \parпосле закрывающей скобки устраняет ошибку, но тогда \vspaceигнорируется во всех случаях.

решение1

Проблема заключается в том, как вы сообщаете \romajiоб использовании курсива. Команда \textit{}ожидает аргумент, поэтому не может обрабатывать разрывы абзацев. Вот почему она жалуется, когда встречает \par. Один из вариантов — просто опустить \parв конце каждой \romajiкоманды. Возможно, лучшим вариантом будет использовать {\itshape …}, который применяется ко всему, что следует за ней, и может обрабатывать разрывы абзацев. См. следующий MWE для примера.

\documentclass{article}
\newcommand{\romaji}[1]{\begingroup\fontsize{10}{11.5}\selectfont{\itshape {#1}}\endgroup}
\begin{document}

\textit{sambi\ shite\ me\ o\ muketeru,\ anata\ ni}

{\itshape sambi\ shite\ me\ o\ muketeru,\ anata\ ni\par}

\romaji{sambi\ shite\ me\ o\ muketeru,\ anata\ ni\par}
\end{document}

введите описание изображения здесь

Связанный контент