定义一个命令来跳转到长度单位的整数倍

定义一个命令来跳转到长度单位的整数倍

我希望定义这样一个命令,使用它我们可以跳转到 的整数倍的水平位置1em。例如,如果我们位于左侧 1.2em 的位置,那么使用此命令我们可以到达左侧 2em 的位置。

\zsaveposx我对如何使用这个包有一些想法zref,但代码会很长而且很棘手。我也读过这个问题,其中提到了tabto包,我认为这可能有用,但我不知道要标签多少。

如何定义这样的命令?

答案1

这利用了长度可以作为数字(以 sp 为单位)存储在寄存器中的事实\newcount。通过这个技巧,我可以使用除以两个长度\divide并实现小数部分的截断。

\nexttab制表符到下一个增量\reflen,这里指定为 1em。在 MWE 中,我将 放在下一个X可用的制表符位置。下面的规则只是为了确认制表符的真实性。

\documentclass{article}
\usepackage{tabto}
\newlength\reflen
\newcount\z
\newcount\refsp
\reflen=1em
\refsp=\reflen
\newcommand\nexttab{%
  \tabto*{0em}%
  \z=\TabPrevPos
  \divide\z by \refsp
  \tabto{\the\numexpr\z +1\relax\reflen}%
}
\begin{document}
\noindent This is a test\nexttab X\\
This is a\nexttab X\\
This is\nexttab X\\
This\nexttab X

\noindent\smash{%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{5ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{8ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{8ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{11ex}\rule{.98\reflen}{1pt}}
\end{document}

在此处输入图片描述

如果\reflen调整为 1.1em,结果为

在此处输入图片描述

最后,我们了解到 CMm实际上是0.84em宽度

\documentclass{article}
\usepackage{tabto}
\newlength\reflen
\newcount\z
\newcount\refsp
\reflen=.84em
\refsp=\reflen
\newcommand\nexttab{%
  \tabto*{0em}%
  \z=\TabPrevPos
  \divide\z by \refsp
  \tabto{\the\numexpr\z +1\relax\reflen}%
}
\begin{document}
\noindent This is a test\nexttab mmmmm\\
This is a\nexttab mmmmm\\
This is\nexttab mmmmm\\
This\nexttab mmmmm

\noindent\smash{%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{5ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{8ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{8ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{11ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{11ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{11ex}\rule{.98\reflen}{1pt}%
}
\end{document}

在此处输入图片描述

答案2

如果实际用例是为了确保内联数学不会干扰字符对齐,您可以将其放置在字符宽度倍数的框中,比较此处的第一个和第二个块

在此处输入图片描述

\documentclass{article}

\newcommand\zz[1]{{\ttfamily\sbox0{$#1$}%
\sbox2{A}%
\makebox[\numexpr1+(\wd0/\wd2)\relax\wd2]{\usebox0}}}

\begin{document}
\raggedright
\ttfamily


ABCDEF ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN
ZZ ABCDEF ONE WO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN
ABCDEF ONE TWO Z $x^2+\alpha$ THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN
ABCDEF ONE TWO Z THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN
ABCDEF ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN
ABCDEF ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN

\bigskip


ABCDEF ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN
ZZ ABCDEF ONE WO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN
ABCDEF ONE TWO Z \zz{x^2+\alpha} THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN
ABCDEF ONE TWO Z THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN
ABCDEF ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN
ABCDEF ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN

\end{document}

相关内容