我想要一个截断文本的命令,例如
“一个例句。”
到
“...请说一句话。”。
当这样调用时
\truncateToLeft{4cm}{An example sentence.}
我不知道如何实现这一点(我不明白/usr/share/texmf-dist/tex/latex/truncate/truncate.sty
)。
编辑:我注意到以下答案的一个(非常小的)问题是,文本没有在“字母边框”处被剪切。只是问一下(我不是 (La)TeX 专家):是否可以在“字母边框”处剪切文本? --> Steven B. Segletes 的第二个答案解决了这个问题!
答案1
只是为了好玩,这是另一种方法。虽然没有指定含义,但我将参数 #1 中的长度视为剩余的长度,而不是被截断的长度。
这个答案有两个部分:第一个答案将字符串中间的字符剪辑到指定的长度;第二个答案剪辑到指定长度内的最近字符边界(同时允许在文本中声明字体)。
第1部分
解决方案依赖于 比任何单个字符都宽的事实\ldots
。方法是递归地从句子开头剥离字母,直到结果小于目标宽度。然后,在 之后,\ldots
取先前的结果(略大于目标宽度),并将其设置在目标宽度的右对齐框中。这将使最左侧字符的额外部分与 的右端重叠\ldots
。为了解决这个小的不匹配问题,\ldots
再次在白色框中向左重叠,以消除悬垂。
最后,将结果重新调整到右侧,以将您带到打印结果的末尾(最后阶段是编辑,因为我意识到我将当前位置放得太靠左了。
已编辑以简化代码,并且如果将空参数传递给则删除病态情况\clip
。
\documentclass{article}
\usepackage{xcolor}
\newlength\cliplength
\newcommand\clip[2]{\setlength\cliplength{#1}\cliphelper#2\relax\relax}
\def\cliphelper#1#2\relax{%
\fboxsep 0pt%
\setbox0=\hbox{#2}%
\ifdim\wd0>\cliplength%
\cliphelper#2\relax%
\else%
\setbox0=\hbox{#1#2}%
\ldots\makebox[\cliplength][r]{\box0}%
\kern-\cliplength\llap{\colorbox{white}{\strut\ldots}}%
\kern\cliplength%
\fi%
}
\parindent 0in
\begin{document}
\ldots\rule{1cm}{1pt}
\clip{1cm}{An example sentence.}
\ldots\rule{2cm}{1pt}
\clip{2cm}{An much longer example sentence.}
\ldots\rule{3cm}{1pt}
\clip{3cm}{An much longer example sentence.}
\end{document}
第2部分
OP 后来想知道是否剪切可以发生在字母边界处。这个问题实际上更容易,可以不用 来完成xcolor
,并且只需要对我的例程进行一点小小的改变\cliphelper
。在这种情况下,一旦测试字符串变得小于目标剪辑宽度,我只需设置\ldots
和 测试字符串。这是 MWE,它将剪辑到与目标剪辑宽度相同或略小于目标剪辑宽度的最近字母边界:
REEDITED 支持字体大小/形状声明宏(不接受参数)。
\documentclass{article}
\newlength\cliplength
\newcommand\clip[2]{%
\def\savedmacro{}\setlength\cliplength{#1}\cliphelper#2\relax\relax}
\def\cliphelper#1#2\relax{%
\setbox0=\hbox{\savedmacro#2}%
\ifdim\wd0>\cliplength% Is length larger than \cliplength?
\savethemacros{#1}{#2}% If #1 is a macro, save it
\cliphelper#2\relax% Recursively clip next letter
\else%
\ldots\savedmacro#2% Final typeset, once string length below \cliplength
\fi%
}
\makeatletter
\def\savethemacros#1#2{%
\ifcat A\noexpand#1\else\ifcat 1\noexpand#1\else% Skip cat11 and cat12
\protected@edef\savedmacro{\savedmacro#1}% Save the macro
\fi\fi%
}
\makeatother
\begin{document}
\ldots\rule{1cm}{1pt}\par
\clip{1cm}{An example sentence.}
\ldots\rule{2cm}{1pt}\par
\clip{2cm}{An much longer example sentence.}
\ldots\rule{3cm}{1pt}\par
\clip{3cm}{An much longer example sentence.}
\ldots\rule{1cm}{1pt}\par
\clip{1cm}{An \bfseries\itshape example sentence.\normalfont}
\ldots\rule{2cm}{1pt}\par
\clip{2cm}{An much longer example \bfseries sentence\normalfont.}
\ldots\rule{3cm}{1pt}\par
\clip{3cm}{\large An much \itshape longer example \bfseries\tiny sentence\normalfont.}
\end{document}
答案2
\documentclass{article}
\usepackage{trimclip}
\begin{document}
\ldots\clipbox{{\width - 1cm} 0pt 0pt 0pt}{An example sentence.}
\end{document}
答案3
ConTeXt 提供了一个宏,\limitatetext
用于将文本截断为给定的宽度。您可以将宽度设置为负数以获得所需的行为。例如:
\limitatetext{An example sentence}{-3cm}{\unknown}
给出
这总是会在“字母边界”处剪切文本。