划分维度以获得计数

划分维度以获得计数

有没有办法将两个dimens 相除得到一个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 将尺寸或长度寄存器视为带有单位的数字sp1pt= 65536sp)。
  • \strip@ptpt从 的结果中删除单位\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}

输出

在此处输入图片描述

相关内容