assert
特定の条件をアサートするためにさまざまなプログラミング言語で提供されるコマンドに類似するものはありますか?
特に、.tex
使用しているエンジン (LuaLaTeX や PDFLaTeX など) に関するアサーションをファイルに組み込む方法を探しています。ifluatex
を使用すると、使用されているエンジンを確認できますが、それでも、必要な内容を示すかなり冗長な表記を使用する必要があります (さらに、エラーをスローして選択したメッセージを表示する方法もまだわかりません)。
assert
明確にするために言うと、私はアサーションが満たされない場合にエラーを引き起こし、それ以外は何もしないようなプリミティブを探しています。アサーションに関して私が見つけた唯一の他の質問はこれですしかし、回答ではそれを回避し、代わりに質問に合わせた解決策を提供しています。ただし、特定の条件を主張する一般的な方法を探しています。
答え1
LuaTeX を検出する通常の方法は、\directlua
ドキュメントクラスまたはパッケージをロードする前にプリミティブをチェックすることです。エラーを発生させるには、 を使用します\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 エンジンが検索する場所に置きます。例として 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
。
これは、引数が有効なアサーションであるかどうかをチェックしません。不明な引数は満たされているものとして扱われます。