让负 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}

在此处输入图片描述

相关内容