有没有办法将两个dimen
s 相除得到一个count
?例如,如果我有一个盒子,它不能放在一页纸上,我想知道这个盒子需要多少页(即\heightofbox / \textheight
),我可以通过计数或宏来获得这个数字,而无需任何尾随单位?
答案1
\dimexpr
计算可以使用 e-TeX 的或进行\numexpr
。在下面的例子中,中的第一个表达式\typeout
计算一个实数,在第二个表达式中,结果是一个向上舍入的整数:
\documentclass{article}
\newsavebox{\mybox}
\begin{document}
\sbox\mybox{\rule{1pt}{3000pt}}
\makeatletter
\typeout{\strip@pt\dimexpr 1pt * \ht\mybox / \textheight\relax}
\typeout{\the\numexpr(\ht\mybox + \textheight/2)/\textheight\relax}
\makeatother
\end{document}
结果:
5.45454
6
评论:
- 在数值环境中,(e-)TeX 将尺寸或长度寄存器视为带有单位的数字
sp
(1pt
=65536sp
)。 \strip@pt
pt
从 的结果中删除单位\dimexpr
。- e-TeX
\...expr
命令对结果进行四舍五入。对于你的情况,你可能想要取整。这可以通过添加除数的一半来实现。 - 表达式是可扩展的,因此很容易在计数器分配或内部使用它们
\edef
。
但这些数字应该谨慎对待:
- 如果盒子里装有较大且不易破碎的物品,则结果将是盒子里装的物品超出
\vbox
计算的页数,从而减少页数。 - 盒子可能含有可拉伸胶水,可能占用比自然盒子高度计算更多的空间。页面数量可能多于计算值。
为了更精确地计算,可以使用拆分框\vsplit
来获取所需的页数。根据应用程序,还可以使用页面引用来计算页数。
答案2
您可以直接使用技巧截断除法\counter=\length
,即用长度(单位为pt
)乘以 65536 来获得整数sp
单位(egreg 教我的)。然后您可以除法并获得截断结果。
\documentclass{article}
\newcount\mycounterA
\newcount\mycounterB
\mycounterA=\textheight\relax
\mycounterB=\dimexpr100cm\relax
\begin{document}
\the\mycounterA\par
\the\mycounterB\par
The result is : \divide\mycounterB by\mycounterA\the\mycounterB\par
\advance\mycounterB by 1%
Pages needed : \the\mycounterB
\end{document}
答案3
这fp
包裹可以管理浮点运算,而\strip@pt
是一个从长度中剥离维度的核心宏。这是一个小例子:
\documentclass{article}
\usepackage[nomessages]{fp}% http://ctan.org/pkg/fp
\newlength{\lengthA}\newlength{\lengthB}
\begin{document}
\setlength{\lengthA}{20em}
\verb|\lengthA: |\the\lengthA \par
\setlength{\lengthB}{5em}
\verb|\lengthB: |\the\lengthB \par
\bigskip
\makeatletter
\edef\valueA{\strip@pt\lengthA}
\edef\valueB{\strip@pt\lengthB}
\FPeval\result{\valueA/\valueB}
\verb|\lengthA/\lengthB: |\result
\end{document}
答案4
您可以将维度转换为计数器,而它们的除法结果将为截断整数,但简单的除法会给您带来问题结果。除法是:问(\textwidth
) 进去页(\heightoftext
)?
数学公式为ceil(p/q)
(四舍五入)。因为页和问是整数值(TeX 中的计数器),我们可以用一点技巧来实现上限函数。
让我们看看问= 4,页= 2,…,9:
页 │ 9 8 7 6 5 4 3 │ ──────────────────────┼──────────────────────────┼──────────────────────────────────────── int( p / q) │ 2 2 1 1 1 1 0 │ 我们得到什么 ceil( p / q) │ 3 2 2 2 2 1 1 │ 我们想要的 int(p / q) + 1 │ 3 3 2 2 2 2 1 │ 适用于 p/q ≠ int(p/q) int((p-1)/q) + 1 │ 3 2 2 2 2 1 1 │ = ceil(p/q)
倒数第二行需要移动一位才能得到实际的上限函数,我们通过减去1
从中减去来实现问。
\def\divideMeCount#1#2{%
\countp=#1\relax%
\advance\countp by -1\relax%
\countq=#2\relax%
\divide\countp by \countq\relax%
}
另一种解决方案是使用循环有效地计算页数:
\def\divideMeLoop#1#2{%
\dimenp=#1\relax%
\dimenq=#2\relax%
\tempi=0\relax%
\loop\advance\dimenp by -\dimenq\relax\advance\tempi by 1\relax%
\ifdim\dimenp>0pt\relax\repeat%
}
价值观
\textheight = 550.0pt
\heightofbox =
1099pt
1100pt
1101pt
代码
\documentclass{article}
\newcount\countp
\newcount\countq
\newdimen\dimenp
\newdimen\dimenq
\newcount\tempi
\newdimen\heightofbox
\def\divideMeCount#1#2{%
\countp=#1\relax%
\advance\countp by -1\relax%
\countq=#2\relax%
\divide\countp by \countq\relax%
}
\def\divideMeLoop#1#2{%
\dimenp=#1\relax%
\dimenq=#2\relax%
\tempi=0\relax%
\loop\advance\dimenp by -\dimenq\relax\advance\tempi by 1\relax%
\ifdim\dimenp>0pt\relax\repeat%
}
\usepackage{pgf}
\begin{document}
\heightofbox=1099pt\relax
\the\heightofbox/\the\textheight\par
{\bfseries Counters\par}
\divideMeCount{\heightofbox}{\textheight}
counpt+1=\number\numexpr\countp+1\relax\par
{\bfseries Dimensions (Loop)\par}
\divideMeLoop{\heightofbox}{\textheight}
tempi=\the\tempi\par
{\bfseries PGF (example)\par}
\pgfmathtruncatemacro{\result}{ceil(\heightofbox/\textheight)}
result=\result
\bigskip
\heightofbox=1100pt\relax
\the\heightofbox/\the\textheight\par
{\bfseries Counters\par}
\divideMeCount{\heightofbox}{\textheight}
counpt+1=\number\numexpr\countp+1\relax\par
{\bfseries Dimensions (Loop)\par}
\divideMeLoop{\heightofbox}{\textheight}
tempi=\the\tempi\par
{\bfseries PGF (example)\par}
\pgfmathtruncatemacro{\result}{ceil(\heightofbox/\textheight)}
result=\result
\bigskip
\heightofbox=1101pt\relax
\the\heightofbox/\the\textheight\par
{\bfseries Counters\par}
\divideMeCount{\heightofbox}{\textheight}
counpt+1=\number\numexpr\countp+1\relax\par
{\bfseries Dimensions (Loop)\par}
\divideMeLoop{\heightofbox}{\textheight}
tempi=\the\tempi\par
{\bfseries PGF (example)\par}
\pgfmathtruncatemacro{\result}{ceil(\heightofbox/\textheight)}
result=\result
\end{document}