LaTeX 中的弹性制表位

LaTeX 中的弹性制表位

我想知道是否有可能为 TeX 或 LaTeX 中的代码实现弹性制表位?

弹性制表位摘要

查看页面https://nickgravgaard.com/elastic-tabstops/了解更多信息。

弹性制表位插图,因为它们是一种视觉辅助工具,所以我不知道如何向使用屏幕阅读器的人最好地描述这幅图像。

在上图中,对于函数定义,第一个参数前有一个制表符,在下一行,第二个参数前有一个制表符。Elastic tabstops 随后使这两个参数对齐。

然后下一行中没有制表符,这将重置第一个制表位的位置,因此在以下几行中,第一个制表位位于四个空格处(或其他一些度量,例如四个 em 空格)。

接下来的三行说明制表位并未设置为包含该制表位的第一行的位置,而是设置为该组最右边的制表位。

实现思路

我的第一个实现想法是仅使用 LaTeX 制表环境,如下所示:

\documentclass{article}
\begin{document}
\begin{tabbing}
int someDemoCode(\quad\= int start,                    \\
                      \> int length)                   \\
\{                                                     \\
\quad\= x()                \quad\= /* try making    */ \\
     \> print("hello!")         \> /* this comment  */ \\
     \> doSomethingComplicated()\> /* a bit longer  */ \\
     \> for (i in range(start, length))                \\
     \> \{                                             \\
     \> \quad\= if (isValid(i))                        \\
     \>      \> \{                                     \\
     \>      \> \quad\= count++                        \\
     \>      \> \}                                     \\
     \> \}                                             \\
     \> return count                                   \\
\}                                                     \\
\end{tabbing}
\end{document}

这种方法基本可以解决问题,但有些地方包含该制表位的第一行不是最长的。我可以手动找出最长的行,然后插入一行\kill,例如

\documentclass{article}
\begin{document}
\begin{tabbing}
int someDemoCode(\quad\= int start,                         \\
                      \> int length)                        \\
\{                                                          \\
\quad\= doSomethingComplicated()\quad\= /* a bit longer  */ \kill
     \> x()                          \> /* try making    */ \\
     \> print("hello!")              \> /* this comment  */ \\
     \> doSomethingComplicated()     \> /* a bit longer  */ \\
     \> for (i in range(start, length))                     \\
     \> \{                                                  \\
     \> \quad\= if (isValid(i))                             \\
     \>      \> \{                                          \\
     \>      \> \quad\= count++                             \\
     \>      \> \}                                          \\
     \> \}                                                  \\
     \> return count                                        \\
\}                                                          \\
\end{tabbing}
\end{document}

但这会很繁琐,并且不适用于 noweb。

笔记

我应该指出,我可以使用一个小型 awk 程序来翻译代码,我使用的是 noweb,它支持可以插入 / 等过滤器\>\=这里的问题更多的是让它的tabbing行为更像table使用最长的列,而不是第一个列。另外,我想拥有一些不包含列表环境的东西会更简单,我也对此感到满意。

相关内容