是否有類似於assert
各種程式語言提供的命令來斷言某些條件的東西?
特別是,我正在尋找一種方法來為我的.tex
文件配備有關所用引擎的斷言(例如 LuaLaTeX 或 PDFLaTeX)。我知道我可以用來ifluatex
檢查它是否正在使用,但這仍然需要我使用我想要的相當詳細的符號(此外,我仍然不知道如何拋出錯誤並顯示我選擇的訊息) 。
所以只是為了澄清:我正在尋找這樣的原語,assert
如果斷言不滿足,則會導致錯誤,並且不會執行任何其他操作。我能找到的關於斷言的唯一其他問題是這個,但答案迴避了這一點,而是提供了針對問題量身定制的解決方案。不過,我正在尋找一種通用的方法來斷言某些條件。
答案1
\directlua
檢測 LuaTeX 的常用方法是在載入文件類別或套件之前檢查原語。要引發錯誤,請使用\errmessage
.錯誤發生後,我調用\@@end
終止 LaTeX 運行並阻止用戶只需按 即可繼續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.
答案2
assert.tex
你可以建立一個名為類似的文件
\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
並將其放在 TeX 引擎搜尋到的位置。我通過示例添加了三個斷言。
如果您的文件具有以下形式
\input{assert}
\documentclass{article}
\assert{luatex}
\assert{a4paper}
\begin{document}
Hello world!
\end{document}
然後處理它pdflatex
或xelatex
將停止
! LaTeX Error: Assert failed: luatex.
處理它lualatex
將會停止
! LaTeX Error: Assert failed: a4paper.
新增a4paper
至文件類別選項將使文件可以與lualatex
.
這不會檢查參數是否為有效的斷言;未知的將被視為滿意。