我正在尝试修改 的内部工作原理parcolumns
。我开始对 TeX 宏“编程”语言有一点了解,但我遇到了一些问题。
我想paracolumns
解决三个问题:
- 删除行之间的垂直空间
- 删除列末尾的多余列空间
- 使以上内容成为可选的。
我缩小了范围,我认为问题首先出在以下代码中:
\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)。
有什么想法或有用的评论吗?我对代码最大的问题之一是没有缩进。缩进代码可以吗?还是空格会引起问题?顺便说一句,我刚刚偶然发现了这个参考资料,看起来还不错:
答案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 会将行尾转换为空格),但在控制字之后不需要 :,因为\relax
TeX 在这里再次跳过了空格。
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
(对于宏来说就是这样)。