为什么一些 cs 定义中有多余的空格?

为什么一些 cs 定义中有多余的空格?

在 (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编码风格的一个主要特点是基本上所有空白都被忽略,这使得做这种事情变得更容易(更明确地说,它纯粹是一种编码风格,不会影响实际运行时行为)

相关内容