TeX 编程问题(以及关于 parcolumns 的内容)

TeX 编程问题(以及关于 parcolumns 的内容)

我正在尝试修改 的内部工作原理parcolumns。我开始对 TeX 宏“编程”语言有一点了解,但我遇到了一些问题。

我想paracolumns解决三个问题:

  1. 删除行之间的垂直空间
  2. 删除列末尾的多余列空间
  3. 使以上内容成为可选的。

我缩小了范围,我认为问题首先出在以下代码中:

\vsplit\csname pc@column@\number\count@\endcsname to \dp\strutbox%
\vbox{\unvbox\@tempboxa}%

\vsplit我已经尝试了所有方法来删除应该添加的空间,但得到的结果是不同的。

\csname pc@column@\number\count@\endcsname to \dp\strutbox%

pc@column通过连接数字和计数中的值来创建一个简单的宏名称?


代码parcolumns循环遍历列然后遍历行。它使用\repeat并递归调用\pc@placeboxes。它有一些代码来检查循环当前是否在最后一列并添加一些\hfill。我认为它确实做到了这一点

\ifnum\count@<\pc@columncount%
\strut\hfill%
\ifpc@rulebetween\vrule\hfill\fi%
\fi%

但注释掉这些内容并不会改变什么。(这些是唯一包含注释的代码行\hfill


我懂了

\define@key{parcolumns}{distance}{%
\@tempdimc#1\relax%
}%

创建选项中使用的键值对。我曾尝试复制此操作,但没有成功

\define@key{parcolumns}{extratopspace}{%
\@tempdimq#1\relax%
}%

但我收到关于不存在或其他什么的错误\tempdimq。代码看起来只是分配\tempdimc给第一个参数,我没有看到任何地方\tempdimc被初始化或创建,所以我猜想它是一个内部临时变量,但应该\tempdimq可以工作(除非只有 a、b、c 和 d,因为我试过 e)。


有什么想法或有用的评论吗?我对代码最大的问题之一是没有缩进。缩进代码可以吗?还是空格会引起问题?顺便说一句,我刚刚偶然发现了这个参考资料,看起来还不错:

http://www.tug.org/utilities/plain/cseq.html

答案1

SE 的格式最好是每篇帖子只问一个问题,但无论如何

\csname pc@column@\number\count@\endcsname to \dp\strutbox%

通过将 pc@column 与 number 和 count 中的值连接起来来创建一个简单的宏名称?

是和否:\number是 TeX 基元,它返回存储在计数寄存器中的数字的十进制扩展,因此如果\count@存储 3 并且 strutbox 的深度为 5pt,则上述内容将扩展为

\pc@column@3 to 5pt

(尽管你只能通过 3 的 catcode 11 的方式输入:字母)

但注释掉这些内容并不会改变什么。(这些是唯一包含注释的代码行\hfill

据推测(不看包装)这是列之间的填充,所以如果您的列宽接近填充可用空间,那么无论如何都不会有太多的列间空间需要填充。

I don't see anywhere where `\tempdimc` is being initalized

\tempdim(a b and c)在 LaTeX 格式中定义为临时寄存器。如果您需要更多,则需要分配它们。

答案2

(摘录 David 没有提到的部分)

TeX 通常会忽略行首的空格,因为新行之后 TeX 会“跳过空格”。例如

\define@key{parcolumns}{extratopspace}{%
  \@tempdimc#1\relax
}%

相当于写作

\define@key{parcolumns}{extratopspace}{%
\@tempdimc#1\relax
}%

(在 TeX 代码中,通常使用空格而不是制表符来缩进,因为许多 TeX 用户认为制表符很麻烦。使用两个空格来缩进是很常见的。)您会注意到,我删除了行%尾后的\relax:,虽然%通常使用 : 来避免在代码中添加额外的空格(因为 TeX 会将行尾转换为空格),但在控制字之后不需要 :,因为\relaxTeX 在这里再次跳过了空格。

David 指出这\@tempdimc是由 LaTeX 内核定义的。值得注意的是,这是一个 TeX 寄存器,而不是宏,因此赋值是通过将值放在寄存器名称后面来进行的。LaTeX 为我们提供了\setlength一个包装器来分配“长度”(即 TeX 跳过寄存器),但许多 LaTeX2e 程序员只是直接使用 TeX 方法。

大卫解释说

\csname pc@column@\number\count@\endcsname to \dp\strutbox

\ps@column@3例如,如果\count@值为 ,则构造名称3。值得注意的是,这又不是一个宏名称,而是一个寄存器名称,您可以看到它以与\@tempdimc和相同的方式分配。不是使用\def(对于宏来说就是这样)。

相关内容