我想知道是否有可能为 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
使用最长的列,而不是第一个列。另外,我想拥有一些不包含列表环境的东西会更简单,我也对此感到满意。