Spec-Zone.ru › LaTeX

Выражения

Синтаксис, один из следующих:

\numexpr expression 
\dimexpr expression
\glueexpr expression
\muglue expression

В любом месте, где вы можете записать целое число, или размер TeX, или склейку TeX, или склейку muglue, вы можете вместо этого записать выражение для вычисления этого типа величины.

Например, \the\dimexpr\linewidth-4pt\relax выведет длину, которая на четыре пункта меньше ширины строки (единственная цель \the — показать результат в документе). Аналогично, \romannumeral\numexpr6+3\relax выведет ‘ix’, а \the\glueexpr 5pt plus 1pt * 2 \relax — ‘10.0pt плюс 2.0pt’.

Преимущества использования выражений по сравнению с вычислениями путём выделения регистров и последующим применением \advance, и т. д., заключаются в том, что вычисление выражений не включает присваивания и, следовательно, может выполняться в местах, где присваивания запрещены. Следующий пример вычисляет ширину \parbox.

\newlength{\offset}\setlength{\offset}{2em}
\begin{center}
\parbox{\dimexpr\linewidth-\offset*3}{With malice toward none
with charity for all with firmness in the right as God gives us to see
the right let us strive on to finish the work we are in to bind up the
nation's wounds, to care for him who shall have borne the battle and
for his widow and his orphan \textasciitilde\ to do all which may
achieve and cherish a just and lasting peace among ourselves and with
all nations.  ---Abraham Lincoln, Second Inaugural Address, from the
memorial}
\end{center}

Выражение expression состоит из одного или нескольких слагаемых одного типа (целое число, размер и т. д.), которые складываются или вычитаются. Слагаемое, являющееся числом, размером и т. д., состоит из множителя этого типа, необязательно умноженного или деленного на множители. Множитель типа — это либо величина этого типа, либо заключённое в скобки подвыражение. Выражение даёт результат заданного типа, так что \numexpr даёт целое число, \dimexpr даёт размер и т. д.

В приведённом выше примере с цитатой изменение на \dimexpr\linewidth-3*\offset даёт ошибку Illegal unit of measure (pt inserted). Это происходит потому, что для \dimexpr и \glueexpr, входные данные состоят из значения размера или склейки, за которым следует необязательный множитель, а не наоборот. Таким образом, \the\dimexpr 1pt*10\relax допустимо и даёт ‘10.0pt’, но \the\dimexpr 10*1pt\relax даёт ошибку Illegal unit.

Выражения поглощают токены и выполняют соответствующие математические операции до \relax (который будет поглощён) или до первого недопустимого токена. Таким образом, \the\numexpr2+3px выведет ‘5px’, поскольку LaTeX считывает \numexpr2+3, который состоит из чисел, а затем находит букву p, которая не может быть частью числа. Поэтому он завершает выражение и выводит ‘5’, за которым следует обычный текст ‘px’.

Это поведение завершения полезно при сравнениях. В \ifnum\numexpr\parindent*2 < 10pt Yes\else No\fi, знак меньше завершает выражение, и результатом является ‘Нет’ (в стандартной статье LaTeX).

Выражения могут использовать операторы +, -, * и / вместе со скобками для подвыражений, (...). В выражениях склеек части plus и minus не нуждаются в скобках, чтобы быть затронутыми множителем. Таким образом, \the\glueexpr 5pt plus 1pt * 2 \relax даёт ‘10pt плюс 2pt’.

TeX преобразует другие числовые типы так же, как и при присваивании регистров. Таким образом, \the\numexpr\dimexpr 1pt\relax\relax даст ‘65536’, что является 1pt, преобразованным в масштабированные точки (см. sp, внутренняя единица TeX), а затем преобразованным в целое число. С \glueexpr здесь растяжение и сжатие будут удалены.

В обратном направлении, \numexpr внутри \dimexpr или \glueexpr потребуют соответствующих единиц, как в \the\dimexpr\numexpr 1 + 2\relax pt\relax, что даёт ‘3.0pt’.

Подробности арифметики: каждый множитель проверяется на соответствие допустимому диапазону, числа должны быть меньше 2^{31} по абсолютному значению, а компоненты размеров или склеек должны быть меньше 2^{14} точек, или mu, или fil, и т. д. Арифметические операции выполняются по отдельности, за исключением операции масштабирования (умножение, непосредственно за которым следует деление), которая выполняется как одна объединённая операция с 64-битным промежуточным результатом. Результат каждой операции вновь проверяется на соответствие допустимому диапазону.

Наконец, деление и масштабирование производятся с округлением (в отличие от \divide TeX, который обрезает). Таким образом, \the\dimexpr 5pt*(3/2)\relax помещает ‘10.0pt’ в документ, потому что округляет 3/2 до 2, в то время как \the\dimexpr 5pt*(4/3)\relax даёт ‘5.0pt’.

© 2007–2018 Karl Berry
Public Domain Software
http://latexref.xyz/Expressions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API