是否有类似于assert
各种编程语言提供的命令来断言某些条件?
具体来说,我正在寻找一种方法来为我的.tex
文件配备有关所用引擎的断言(例如 LuaLaTeX 或 PDFLaTeX)。我知道我可以使用ifluatex
它来检查它是否被使用,但这仍然需要我使用相当冗长的符号来表达我想要的内容(此外,我还没有弄清楚如何抛出错误并显示我选择的消息)。
因此,我只想澄清一下:我正在寻找一个这样的原语,assert
如果断言不满足,它将导致错误,否则不会执行任何操作。我能找到的唯一关于断言的其他问题是这个但答案避开了这一点,而是提供了针对该问题的解决方案。不过,我正在寻找一种通用的方法来断言某些条件。
答案1
检测 LuaTeX 的常用方法是\directlua
在加载 documentclass 或包之前检查原语。要引发错误,请使用\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
。
这不会检查参数是否为有效断言;未知的断言将被视为已满足。