![Заставить отрицательное vspace вести себя](https://rvso.com/image/330738/%D0%97%D0%B0%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%BE%D1%82%D1%80%D0%B8%D1%86%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20vspace%20%D0%B2%D0%B5%D1%81%D1%82%D0%B8%20%D1%81%D0%B5%D0%B1%D1%8F.png)
Мой код 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}