Есть ли что-то аналогичное команде assert
, предлагаемой различными языками программирования для утверждения определенных условий?
В частности, я ищу способ снабдить свои .tex
файлы утверждениями об используемом движке (например, LuaLaTeX или PDFLaTeX). Я знаю, что могу использовать ifluatex
для проверки его использования, но это все равно требует от меня использования довольно многословной нотации того, что я хочу (кроме того, я все еще не понял, как выдать ошибку и показать сообщение по моему выбору).
Так что просто для ясности: я ищу примитив, assert
который вызовет ошибку, если утверждение не будет удовлетворено, и не будет ничего делать в противном случае. Единственный другой вопрос относительно утверждений, который я смог найти, былВот этот, но ответы обходят этот вопрос стороной и вместо этого предлагают решения, соответствующие конкретному вопросу.Однако я ищу универсальный способ утверждения определенных условий.
решение1
Обычный способ обнаружения LuaTeX — проверка примитива \directlua
перед загрузкой documentclass или пакетов. Чтобы вызвать ошибку, используйте \errmessage
. После ошибки я вызываю , \@@end
чтобы завершить выполнение LaTeX и не дать пользователю продолжить, просто нажав enter.
\ifdefined\directlua\else
\errmessage{LuaTeX is required to typeset this document}
\csname @@end\expandafter\endcsname
\fi
\documentclass{article}
\begin{document}
Hello
\end{document}
$ pdflatex test.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2018-12-01>
! LuaTeX is required to typeset this document.
l.2 ...uaTeX is required to typeset this document}
?
)
No pages of output.
Transcript written on test.log.
решение2
Вы можете создать файл с assert.tex
таким названием:
\RequirePackage{ifxetex,ifluatex}
\makeatletter
\newif\if@assert
\newcommand\assert[1]{%
\@asserttrue
\csname assert@#1\endcsname
\if@assert\else
\@latex@error{Assert failed: #1}{This document requires #1}%
\expandafter\@@end
\fi
}
\@onlypreamble\assert
\newcommand{\def@assert}[2]{\@namedef{assert@#1}{#2}}
\def@assert{xetex}{\ifxetex\else\@assertfalse\fi}
\def@assert{luatex}{\ifluatex\else\@assertfalse\fi}
\def@assert{a4paper}{%
\ifdim\paperheight=297mm
\ifdim\paperwidth=210mm
\else
\@assertfalse
\fi
\else
\@assertfalse
\fi
}
\makeatother
и поместите его в место, которое ищут движки TeX. Я добавил три утверждения в качестве примера.
Если ваш файл имеет вид
\input{assert}
\documentclass{article}
\assert{luatex}
\assert{a4paper}
\begin{document}
Hello world!
\end{document}
затем обрабатывал его с pdflatex
или xelatex
остановился бы с
! LaTeX Error: Assert failed: luatex.
Обработка его с помощью lualatex
остановится на
! LaTeX Error: Assert failed: a4paper.
Добавление a4paper
к параметрам класса документа сделает документ компилируемым с помощью lualatex
.
При этом не проверяется, является ли аргумент допустимым утверждением; неизвестное утверждение будет рассматриваться так, как если бы оно было удовлетворено.