Fazendo com que o vspace negativo se comporte

Fazendo com que o vspace negativo se comporte

Meu código TeX (incluindo parâmetros nas definições de comando) que cria folhas de letras e folhas de acordes de músicas é gerado dinamicamente por outro código que acessa dados do banco de dados e os processa linha por linha, então meu MWE simplificado pode parecer estranho, mas tenha paciência comigo.

A intenção do trecho de código que você vê é que, além do espaçamento básico entre linhas associado aos dois tamanhos de fonte (que é importante quando as linhas são quebradas), há 0,3em adicionais entre cada "parágrafo" (linha da letra) para maior clareza. No entanto, sempre que uma linha de romaji ocorre imediatamente após uma linha de japonês, não quero aquele parskip extra, então tento negá-lo com um \vspacenegativo do mesmo valor. Até agora, tudo bem - o seguinte arquivo funciona:

\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}

Mas quando um estilo para romaji é adicionado (no meu caso de teste, itálico), ele quebra e eu obtenho um enorme espaço extra. A única diferença entre as capturas de tela esquerda e direita abaixo é a adição de \textit{...}na definição do comando romaji:

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

Aqui está a saída dos dois:

espaçamento misterioso http://l4jp.com/tmp/TeX-tests.png

A reclamação no arquivo de log é:

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

Isso faz sentido, mas só recebo esse erro quando existe \textit{}- talvez o analisador não consiga navegar entre colchetes duplos? Mover o \parapós a chave de fechamento faz com que o erro desapareça, mas então o \vspaceé ignorado em todos os casos.

Responder1

O problema está em como você está dizendo \romajipara usar itálico. O comando \textit{}espera um argumento, portanto não pode lidar com quebras de parágrafo. É por isso que reclama quando encontra \par. Uma opção é simplesmente omitir \paro final de cada \romajicomando. Talvez a melhor opção seja usar {\itshape …}, que se aplica ao que segue e pode lidar com quebras de parágrafo. Veja o seguinte MWE como exemplo.

\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}

insira a descrição da imagem aqui

informação relacionada