给出以下宏定义
\ExplSyntaxOn
\keys_define:nn { titlepage }
{
title .tl_set:N = \l__titlepage_title_tl,
name .tl_set:N = \l__titlepage_name_tl,
place .tl_set:N = \l__titlepage_place_tl,
date .tl_set:N = \l__titlepage_date_tl,
}
\NewDocumentCommand { \myTest } { +m }
{
\group_begin:
\keys_set:nn { titlepage } { #1 }
\begin{titlepage}
\vspace*{2cm}
\begin{center}
{
\fontsize{20}{20}
\selectfont
Some Text Here % Why are spaces ignored?
% Why is no new paragraph created here?
And More Text\\ With Spaces
}
\textbf{\l__titlepage_title_tl}
\l__titlepage_name_tl
\end{center}
\end{titlepage}
\group_end:
}
\ExplSyntaxOff
像这样调用它:
\myTest{title=My Big Fat Title, name=John Doe}
我屈服了
我怎样才能使这个宏表现得像在“正常” LaTeX 模式下一样?
答案1
空格和换行符一直是 TeX 编程中的问题。当开始开发一种新的 LaTeX 编程风格时,即expl3
,团队决定
提供控制扩展的工具,而无需猜测可能很长的字符串应该放在哪里
\expandafter
;提供工具以避免每次出现特定问题时都需要重新发明轮子;
彻底消除空格和尾线的问题。
有人会说,我通过回答有关意外空间悄悄出现的问题而在这里树立了自己的名声。
然而,这是有代价的:如果存在需要排版的内容,则在某些情况下代码中需要空格。
对于这种情况,提供的解决方案是使用~
,在的范围内\ExplSyntaxOn
是单个空格标记;连续的~
标记遵循空格的标准规则,因此它们被压缩为单个空格;此外,~
是不是在行末删除,与标准设置中的空格不同。相反,~
根据 TeX 规则,在行首删除。
\begin{center}
{
\fontsize{20}{32}\selectfont
Some~Text~Here\\
And~More~Text\\ With~Spaces\\
}
\textbf{\l__titlepage_title_tl}\\
\l__titlepage_name_tl
\end{center}
我改成\fontsize{20}{20}
了\fontsize{20}{32}
:否则线条会非常压缩。
\\
在 内部时,我使用 忽略空行center
(这可以完成\par
,但也可以完成其他工作)。在 外部center
,使用\par
。