仅打印文本的前 20 个字符,添加 \ldots

仅打印文本的前 20 个字符,添加 \ldots

是否可以将章节名称截断为 - 比如说 - 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 提供了两个宏来实现这一点。

  1. \doboundtext
  2. \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了解实施细节。

相关内容