¿Existe algo análogo al assert
comando que ofrecen varios lenguajes de programación para afirmar determinadas condiciones?
En particular, estoy buscando una manera de equipar mis .tex
archivos con afirmaciones sobre el motor utilizado (por ejemplo, LuaLaTeX o PDFLaTeX). Sé que puedo usarlo ifluatex
para 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 assert
esa 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 \directlua
primitiva antes de cargar la clase de documento o los paquetes. Para generar un error, utilice \errmessage
. Después del error, llamo \@@end
para 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.tex
como
\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 pdflatex
o xelatex
pararía con
! LaTeX Error: Assert failed: luatex.
Procesarlo con lualatex
se detendrá con
! LaTeX Error: Assert failed: a4paper.
Agregar a4paper
opciones 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.