¿Existe una forma estándar de afirmar el motor utilizado o similar y provocar un error en caso contrario?

¿Existe una forma estándar de afirmar el motor utilizado o similar y provocar un error en caso contrario?

¿Existe algo análogo al assertcomando que ofrecen varios lenguajes de programación para afirmar determinadas condiciones?

En particular, estoy buscando una manera de equipar mis .texarchivos con afirmaciones sobre el motor utilizado (por ejemplo, LuaLaTeX o PDFLaTeX). Sé que puedo usarlo ifluatexpara verificar si se está usando, pero eso aún requiere que use una notación bastante detallada de lo que quiero (además, todavía no he descubierto cómo generar un error y mostrar un mensaje de mi elección) .

Entonces, solo para aclarar: estoy buscando una primitiva como assertesa que causará un error si la afirmación no se cumple y no hará nada de lo contrario. La única otra pregunta sobre las afirmaciones que pude encontrar fueÉste, pero las respuestas eluden eso y, en cambio, brindan soluciones adaptadas a la pregunta.Sin embargo, estoy buscando una forma genérica de afirmar ciertas condiciones.

Respuesta1

La forma habitual de detectar LuaTeX es comprobar la \directluaprimitiva antes de cargar la clase de documento o los paquetes. Para generar un error, utilice \errmessage. Después del error, llamo \@@endpara finalizar la ejecución de LaTeX y evitar que el usuario continúe simplemente presionando 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.

Respuesta2

Puedes crear un archivo llamado assert.texcomo

\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

y colóquelo en una ubicación buscada por los motores TeX. Agregué tres afirmaciones a modo de ejemplo.

Si su archivo tiene la forma

\input{assert}

\documentclass{article}

\assert{luatex}
\assert{a4paper}

\begin{document}

Hello world!

\end{document}

luego procesándolo con pdflatexo xelatexpararía con

! LaTeX Error: Assert failed: luatex.

Procesarlo con lualatexse detendrá con

! LaTeX Error: Assert failed: a4paper.

Agregar a4paperopciones de clase de documento hará que el documento sea compilable con lualatex.

Esto no verifica que el argumento sea una afirmación válida; uno desconocido será tratado como si estuviera satisfecho.

información relacionada