确定文本长度的函数,可用于需要内部单位(例如“em”)的地方

确定文本长度的函数,可用于需要内部单位(例如“em”)的地方

有没有办法定义一个函数\horizontallengthof,以内部单位返回一段文本的长度?我希望能够在任何需要这种东西的地方使用它,例如p{\horizontallengthof{this particular piece of text}}(在表格规范中)或\hspace{\horizontallengthof{this particular piece of text}}


我不太愿意发布一个特定的用例,因为我对通用解决方案感兴趣,而不是针对特定情况的解决方法。但这里有一个(用calc's\widthof代替\horizontallengthof):

\documentclass{article}
\usepackage{fixltx2e}
\usepackage{calc}

\begin{document}

\begin{tabular}{p{0em}@{\hspace{1.0em}\quad}l@{\qquad}l}
  \(\bullet\) & \(x = y\) & \(z = w\) \\
  \(\bullet\) & \(a = b\) & \(c = d\) \\
\end{tabular}

\begin{tabular}{p{\widthof{\(\bullet\)}}@{\hspace{1.0em}\quad}l@{\qquad}l}
  \(\bullet\) & \(x = y\) & \(z = w\) \\
  \(\bullet\) & \(a = b\) & \(c = d\) \\
\end{tabular}

\begin{tabular}{p{\widthof{\(\bullet\)}}@{\hspace{1.0em-\widthof{\(\bullet\)}}\quad}l@{\qquad}l}
  \(\bullet\) & \(x = y\) & \(z = w\) \\
  \(\bullet\) & \(a = b\) & \(c = d\) \\
\end{tabular}

\end{document}

根据添加的建议fixltx2e,这可以正确编译,但我希望第二个表格具有与第一个表格相同的外观(间距方面),同时不给我任何Overfull \hbox警告。表 3 是实现此目标的失败尝试。

我最初没有发布此文的原因之一是我不希望任何潜在的解决方法分散人们对一般(在我看来是需要的)解决方案的注意力。

答案1

嗯,可以说这是一个calc和/或 LaTeX 错误。

使用calc\widthof可以在您提到的大多数地方工作(如在 LaTeX2e 中,这些地方明确更改为\setlength内部使用,以便它们可以与一起使用calc。但是\hspace似乎已经逃脱了这种转换,以下补丁修复了这个问题.....

\documentclass{article}

\usepackage{calc} 

\makeatletter
\def\@hspace#1{\begingroup\setlength\dimen@{#1}\hskip\dimen@\endgroup}
\makeatother

\begin{document}

 a\hspace{\widthof{some text}}b 

\end{document}

以上回答了最初的问题,但后来的编辑澄清说这完全没有必要。 \widthof是一项相对昂贵的操作,并且执行每一行只是为了腾出空间来插入您测量的相同文本,这实际上只是在折磨您的计算机而没有任何实际好处。第二个表中的公式与您在第一个表中给出的版本相匹配,没有过满的框,也没有测量任何东西。

在此处输入图片描述

\documentclass{article}
\usepackage{fixltx2e}
\usepackage{calc}

\begin{document}

\begin{tabular}{p{0em}@{\hspace{1.0em}\quad}l@{\qquad}l}
  \(\bullet\) & \(x = y\) & \(z = w\) \\
  \(\bullet\) & \(a = b\) & \(c = d\) \\
\end{tabular}

\begin{tabular}{@{\hspace\tabcolsep\rlap{$\bullet$}\hspace{1.0em}\quad}l@{\qquad}l}
   \(x = y\) & \(z = w\) \\
   \(a = b\) & \(c = d\) \\
\end{tabular}

\end{document}

答案2

calc修补了一些主要的 LaTeX 构造,以便接受扩展语法。但是,它对 却没有做同样的事情\hspace

该命令\widthof可以在\setlength和 的参数中使用\parboxminipage也可以在p-column 说明符中使用。

\hspace您可以获得与之兼容的版本\widthof,但我不会用它作为替代品。

\documentclass{article}
\usepackage{xparse,calc}
\newlength\Hspacelen
\NewDocumentCommand{\Hspace}{sm}
 {\setlength\Hspacelen{#2}%
  \IfBooleanTF{#1}
    {\hspace*{\Hspacelen}}
    {\hspace{\Hspacelen}}%
 }

\makeatletter
%\def\Hspace#1#{\@Hspace{#1}}
%\def\@Hspace#1#2{\setlength\@tempdima{#2}\hspace#1{\@tempdima}}
\makeatother

\begin{document}
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

a\Hspace{\widthof{text}}b

\Hspace*{\widthof{text}}ab
\end{document}

注释版本是一个更快的替代版本。

但是,由于你可能不希望在分页符处消失的空格,因此更快的方法是说

\leavevmode\hphantom{text}

不要忘记\leavevmode在段落的开头;如果\hphantom它在段落的中间,那就无关紧要了。

答案3

\wd作用吗?

例如:

\newsavebox{\mymeasure} % only 1 time, in the preamble

然后:

\sbox{\mymeasure}{this particular piece of text}
X\hspace{\wd\mymeasure}X

因此,在您的序言中只有 1 个命令:

\newsavebox{\mymeasure}
\newcommand{\measure}[1]{\sbox{\mymeasure}{#1}\wd\mymeasure}

用法:

X\hspace{\measure{this particular piece of texte}}X

答案4

这是我的做法。

\documentclass{article}
\begin{document}
\newcommand\findwidth[1]{\setbox0\hbox{#1}\the\wd0}
This text is how long? \findwidth{This text is how long?}
\par\rule{\wd0}{1ex}
\end{document}

相关内容