讓負虛擬空間發揮作用

讓負虛擬空間發揮作用

我的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{...}在 romaji 命令定義中添加了:

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

在此輸入影像描述

相關內容