是否存在一种标准方法来断言所使用的引擎或类似引擎,否则会导致错误?

是否存在一种标准方法来断言所使用的引擎或类似引擎,否则会导致错误?

是否有类似于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

这不会检查参数是否为有效断言;未知的断言将被视为已满足。

相关内容