Existe algo análogo ao assert
comando oferecido por várias linguagens de programação para afirmar certas condições?
Em particular, estou procurando uma maneira de equipar meu.tex
arquivos com afirmações sobre o mecanismo usado (por exemplo, LuaLaTeX ou PDFLaTeX). Eu sei que posso usar ifluatex
para verificar se está sendo usado, mas isso ainda exige que eu use uma notação bastante detalhada do que quero (além disso, ainda não descobri como gerar um erro e mostrar uma mensagem de minha escolha) .
Então, só para esclarecer: estou procurando uma primitiva como assert
essa que causará um erro se a afirmação não for satisfeita e não fará nada de outra forma. A única outra questão relativa a afirmações que pude encontrar foiEste, mas as respostas evitam isso e, em vez disso, fornecem soluções adaptadas à questão.No entanto, estou procurando uma maneira genérica de afirmar certas condições.
Responder1
A maneira usual de detectar o LuaTeX é verificar a \directlua
primitiva antes de carregar a documentclass ou os pacotes. Para gerar um erro, use \errmessage
. Após o erro, chamo \@@end
para encerrar a execução do LaTeX e evitar que o usuário continue pressionando apenas 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.
Responder2
Você pode fazer um arquivo chamado 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
e coloque-o em um local pesquisado pelos motores TeX. Adicionei três afirmações a título de exemplo.
Se o seu arquivo tiver o formato
\input{assert}
\documentclass{article}
\assert{luatex}
\assert{a4paper}
\begin{document}
Hello world!
\end{document}
então processá-lo com pdflatex
ou xelatex
pararia com
! LaTeX Error: Assert failed: luatex.
O processamento com lualatex
irá parar com
! LaTeX Error: Assert failed: a4paper.
Adicionar a4paper
opções à classe do documento tornará o documento compilável com lualatex
.
Isso não verifica se o argumento é uma afirmação válida; um desconhecido será tratado como se estivesse satisfeito.