![讓負虛擬空間發揮作用](https://rvso.com/image/330738/%E8%AE%93%E8%B2%A0%E8%99%9B%E6%93%AC%E7%A9%BA%E9%96%93%E7%99%BC%E6%8F%AE%E4%BD%9C%E7%94%A8.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{...}
在 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}