在 (La)TeX 源代码中,定义有时在后面加上一个空格\def
,在定义的控制序列后面也加上一个空格。例如,这两行来自 miniltx.tex:
\long\def \@gobbletwo #1#2{}
...
\long\def\@firstoftwo#1#2{#1}
据我所知,额外的一两个空格对定义没有影响。我猜它们是用来记录某种行为的。这种行为是什么,或者这些空格的用途是什么?
答案1
由于命令序列名称后面的空格在
\long\def \@gobbletwo #1#2{}
此行相当于没有空格的版本:
\long\def\@gobbletwo#1#2{}
无缘无故混合这些风格只是糟糕的编码风格。
可以使用空格来增强可读性或垂直代码对齐,例如:
\long\def\@gobble #1{}
\long\def\@gobbletwo #1#2{}
\long\def\@gobblefour #1#2#3#4{}
\long\def\@firstofone #1{#1}
\long\def\@firstoftwo #1#2{#1}
\long\def\@secondoftwo#1#2{#2}
答案2
miniltx
只花了几分钟的时间,我只是从 latex 格式的 latex.ltx 源中复制了一些东西,直到使用\includegraphics
纯 TeX 工作的示例。
因此,您需要查看 latex.ltx 的源代码,它是由几个人历经数年编写的。
在这种情况下
%
% \begin{macro}{\@gobble}
% \begin{macro}{\@gobbletwo}
% \begin{macro}{\@gobblefour}
% \changes{v1.2n}{1995/05/26}{(CAR) Added \cs{long}s}
% The |\@gobble| macro is used to get rid of its argument.
% \begin{macrocode}
\long\def \@gobble #1{}
\long\def \@gobbletwo #1#2{}
\long\def \@gobblefour #1#2#3#4{}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@firstofone}
% \begin{macro}{\@firstoftwo}
% \begin{macro}{\@secondoftwo}
% Some argument-grabbers.
% \begin{macrocode}
\long\def\@firstofone#1{#1}
\long\def\@firstoftwo#1#2{#1}
\long\def\@secondoftwo#1#2{#2}
% \end{macrocode}
这让人怀疑额外的空格(根本没有任何作用)是 Chris (CAR) 添加的。这是一种让源代码更具可读性的方法。原始 latex2.09 源代码的大部分内容都是以非常压缩的风格编写的,带有“有趣的”换行符和缩进。因此,在将源代码转换为文档化的 doc/docstrip 格式时,添加了相当多的被忽略的空格。
需要注意的是,使用传统 TeX 设置时,使用风格化空白来布局源代码时必须小心谨慎。expl3
编码风格的一个主要特点是基本上所有空白都被忽略,这使得做这种事情变得更容易(更明确地说,它纯粹是一种编码风格,不会影响实际运行时行为)