是否有標準方法來斷言所使用的引擎或類似引擎,否則會導致錯誤?

是否有標準方法來斷言所使用的引擎或類似引擎,否則會導致錯誤?

是否有類似於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}

然後處理它pdflatexxelatex將停止

! LaTeX Error: Assert failed: luatex.

處理它lualatex將會停止

! LaTeX Error: Assert failed: a4paper.

新增a4paper至文件類別選項將使文件可以與lualatex.

這不會檢查參數是否為有效的斷言;未知的將被視為滿意。

相關內容