VerbatimOut は if-then-else 内の特殊記号でクラッシュします

VerbatimOut は if-then-else 内の特殊記号でクラッシュします

このコードは、lualatex、xelatex、pdflatex で問題なくコンパイルされます。

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{VerbatimOut}{x.txt}
^^_
\end{VerbatimOut}
\end{document}

ただし、これは pdflatex でのみコンパイルされ、lualatex および xelatex では失敗します。

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\openin 15=x.txt
\ifeof 15
\begin{VerbatimOut}{x.txt}
^^_
\end{VerbatimOut}
\fi
\end{document}

私が得たものは次のとおりです:

! Text line contains an invalid character.
l.7 ^^_

どうすればコンパイルできますか?全てラテックス?

答え1

さて、ここでちょっとした問題があります。 は^^_luatex では無効な入力であり、これを検出するとエラーが発生します。問題は ではなく\VerbatimOutx.txtがすでに存在する場合は偽のブランチになり、luatex は内容をスキップしますが、それでも を検出します^^_

たとえば、これは問題なくコンパイルされます:

\documentclass{article}

\begin{document}
{
\iftrue 
\catcode`\^=11
\catcode`\_=11
^^_
\fi
}

\end{document}

しかし、それを変更すると\iffalseエラーが発生します

\documentclass{article}

\begin{document}
{
\iffalse 
\catcode`\^=11
\catcode`\_=11
^^_
\fi
}

\end{document}

そして、あなたの例では、ファイルの書き込みとチェックの両方が機能します:

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{VerbatimOut}{x.txt}
^^_
\end{VerbatimOut}
\openin 15=x.txt
\ifeof 15
aaa
\fi
\end{document}

aaaしかし、それを置き換えるとすぐに^^_エラーが発生します。そのため、誤ったブランチではこのような入力を避ける必要があります。

関連情報