是否可以将章节名称截断为 - 比如说 - 20 个字符并添加\ldots
内容?以便它适合显示的选项卡空间这里?
答案1
我的意思是,比设置固定字符数更好的方法是设置打印文本的最大尺寸。我建议使用宏\striptext to dimen {text}
来输出文本\striptextout
。 中的文本\striptextout
适合给定宽度的假设框。其他字符(如果存在)将被忽略。
例如\striptext to2cm {foo foo bar bar}
定义\striptextout
为宏foo foo bar b
。或\striptext to1cm {foo foo bar bar}
输出为foo fo
。或\striptext to30cm {foo foo bar bar}
行为类似于\def\striptextout{foo foo bar bar}
。
\def\striptext to#1 #2{\def\striptextout{}\def\tmp{#1}\striptextA #2\relax\end}
\def\striptextA{\futurelet\next\striptextB}
\def\striptextB{\ifx\next\relax \expandafter \skiptoend
\else \ifx\next\spacetoken
\edef\striptextoutA{\striptextout\space}%
\def\next{\afterassignment\striptextD \let\next= }%
\else \def\next{\striptextC}%
\fi \fi
\next
}
\def\striptextC#1{\edef\striptextoutA{\striptextout#1}\striptextD}
\def\striptextD{\setbox0=\hbox{\striptextoutA}%
\ifdim\wd0>\tmp\relax \expandafter \skiptoend
\else \let\striptextout=\striptextoutA \expandafter \striptextA
\fi
}
\def\skiptoend#1\end{}
\edef\tmp{\let\noexpand\spacetoken= \space}\tmp
\striptext to1cm {foo foo bar bar}
\message{:::: \striptextout}
\bye
工作原理:我们需要从给定的文本中获取每个标记,将其累积到\striptextout
并重复对 中的文本进行测量\striptextout
。主要问题是 TeX 不能简单地将空间提供给参数#1
。这就是该宏更复杂的原因。首先我们测试\futurelet\next
是否\next
为空格标记。如果为真,则我们需要通过 从输入流中删除 spacetoken \let\next=
(注意等号后的空格,\let
原语会忽略第一个空格,并从输入流中获取第二个空格)。\let
完成后,处理 中的测量\striptextD
。给定的宽度存储在\tmp
宏中。如果下一个标记不是 spacetoken,则通常由 取该标记#1
。\striptextC
中的测量\striptextD
通常按以下方式处理:将文本存储到\box0
并将宽度\wd0
与 进行比较\tmp
。这里\relax
很重要,因为\ifdim
必须在下一个 之前关闭条件的扩展\expandafter
。通过下一次调用 重复循环\striptextoutA
。\striptoend
宏忽略输入流到分隔符的其余部分\end
。完成后执行此操作。
注意\striptext
:dimen 后面和前面的空格{text}
是必须的。如果您需要以to
以下形式创建更常见的宏(不带子句)
\striptext{dimen}{text}
然后只需写入\def\striptext#1#2{...}
(#1
和之间没有空格#2
。
答案2
ConTeXt 提供了两个宏来实现这一点。
\doboundtext
\limitatetext
这两个命令的用户界面是:
\command {text to be limited} {width} {append}
其中第一个参数可以是任意 TeX 代码,第二个参数可以是任意 TeX 尺寸,第三个参数可以是任意 TeX 代码。
该\doboundtext
宏与 @wipet 定义的宏类似\striptex
;它将内容排版在一个框中,然后截断该框。这种方法的一个缺点是文本不会连字符。
该\limitatetext
宏更强大,允许文本跨行。例如,在读取文件时
\limitatetext{\input ward \relax}{6cm}{\unknown}
给出
还有\limitatetext
另一个版本,它允许您从结尾处挑选一些材料。例如:
\limitatetext{\input ward \relax}{6cm,2cm}{\unknown}
给出
看supp-box.mkiv了解实施细节。