使用されているエンジンなどをアサートし、そうでない場合はエラーを発生させる標準的な方法はありますか?

使用されているエンジンなどをアサートし、そうでない場合はエラーを発生させる標準的な方法はありますか?

assert特定の条件をアサートするためにさまざまなプログラミング言語で提供されるコマンドに類似するものはありますか?

特に、.tex使用しているエンジン (LuaLaTeX や PDFLaTeX など) に関するアサーションをファイルに組み込む方法を探しています。ifluatexを使用すると、使用されているエンジンを確認できますが、それでも、必要な内容を示すかなり冗長な表記を使用する必要があります (さらに、エラーをスローして選択したメッセージを表示する方法もまだわかりません)。

assert明確にするために言うと、私はアサーションが満たされない場合にエラーを引き起こし、それ以外は何もしないようなプリミティブを探しています。アサーションに関して私が見つけた唯一の他の質問はこれですしかし、回答ではそれを回避し、代わりに質問に合わせた解決策を提供しています。ただし、特定の条件を主張する一般的な方法を探しています。

答え1

LuaTeX を検出する通常の方法は、\directluaドキュメントクラスまたはパッケージをロードする前にプリミティブをチェックすることです。エラーを発生させるには、 を使用します\errmessage。エラーの後、 を呼び出して\@@endLaTeX の実行を終了し、ユーザーが を押すだけで続行できないようにします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 エンジンが検索する場所に置きます。例として 3 つのアサーションを追加しました。

ファイルが以下の形式の場合

\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

これは、引数が有効なアサーションであるかどうかをチェックしません。不明な引数は満たされているものとして扱われます。

関連情報