Existe uma maneira padrão de afirmar o mecanismo usado ou similar e causar um erro caso contrário?

Existe uma maneira padrão de afirmar o mecanismo usado ou similar e causar um erro caso contrário?

Existe algo análogo ao assertcomando 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 ifluatexpara 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 assertessa 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 \directluaprimitiva antes de carregar a documentclass ou os pacotes. Para gerar um erro, use \errmessage. Após o erro, chamo \@@endpara 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.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

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 pdflatexou xelatexpararia com

! LaTeX Error: Assert failed: luatex.

O processamento com lualatexirá parar com

! LaTeX Error: Assert failed: a4paper.

Adicionar a4paperopçõ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.

informação relacionada