Существует ли стандартный способ подтверждения используемого движка или аналогичного и в противном случае вызвать ошибку?

Существует ли стандартный способ подтверждения используемого движка или аналогичного и в противном случае вызвать ошибку?

Есть ли что-то аналогичное команде 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.

При этом не проверяется, является ли аргумент допустимым утверждением; неизвестное утверждение будет рассматриваться так, как если бы оно было удовлетворено.

Связанный контент