Gibt es etwas Analoges zu dem assert
Befehl, den verschiedene Programmiersprachen anbieten, um bestimmte Bedingungen durchzusetzen?
Insbesondere suche ich nach einer Möglichkeit, meine .tex
Dateien mit Aussagen über die verwendete Engine (z. B. LuaLaTeX oder PDFLaTeX) zu versehen. Ich weiß, dass ich ifluatex
überprüfen kann, ob sie verwendet wird, aber dazu muss ich immer noch eine ziemlich ausführliche Notation dessen verwenden, was ich will (außerdem habe ich immer noch nicht herausgefunden, wie ich einen Fehler auslöse und eine Nachricht meiner Wahl anzeigen kann).
Nur zur Klarstellung: Ich suche nach einem Primitiv wie assert
diesem, das einen Fehler verursacht, wenn die Behauptung nicht erfüllt ist, und sonst nichts tut. Die einzige andere Frage zu Behauptungen, die ich finden konnte, warDieses hier, aber die Antworten weichen dem aus und bieten stattdessen auf die Frage zugeschnittene Lösungen.Ich suche jedoch nach einer allgemeinen Möglichkeit, bestimmte Bedingungen durchzusetzen.
Antwort1
\directlua
Die übliche Methode zum Erkennen von LuaTeX besteht darin , vor dem Laden der Dokumentklasse oder der Pakete nach dem Primitiv zu suchen . Um einen Fehler auszulösen, verwenden Sie \errmessage
. Nach dem Fehler rufe ich auf, \@@end
um den LaTeX-Lauf zu beenden und den Benutzer durch Drücken von am Fortfahren zu hindern 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.
Antwort2
Sie können eine Datei mit assert.tex
dem Namen
\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
und platzieren Sie es an einem von TeX-Engines durchsuchbaren Ort. Ich habe als Beispiel drei Behauptungen hinzugefügt.
Wenn Ihre Datei die Form
\input{assert}
\documentclass{article}
\assert{luatex}
\assert{a4paper}
\begin{document}
Hello world!
\end{document}
dann die Verarbeitung mit pdflatex
oder xelatex
würde aufhören mit
! LaTeX Error: Assert failed: luatex.
Die Verarbeitung mit lualatex
wird beendet mit
! LaTeX Error: Assert failed: a4paper.
Durch das Hinzufügen a4paper
von Optionen zur Dokumentklasse wird das Dokument mit kompilierbar lualatex
.
Dadurch wird nicht überprüft, ob es sich bei dem Argument um eine gültige Behauptung handelt. Ein unbekanntes Argument wird so behandelt, als ob es erfüllt wäre.