`lstinputlisting` の「caption」と「path」の両方のパラメータに単一のパラメータを適用できる新しいコマンドを作成する方法

`lstinputlisting` の「caption」と「path」の両方のパラメータに単一のパラメータを適用できる新しいコマンドを作成する方法

パッケージ リストからのコマンドの使用を簡素化するコマンドを作成したいと思いますlstinputlisting。このコマンドは、ファイル パスとして単一のパラメーターを受け入れ、それを lstinputlisting の caption パラメーターと path パラメーターの両方に渡すことができます。つまり、ファイル パスをキャプションとして使用します。

次の LaTeX ソースを検討してください。

\documentclass[UTF8]{ctexart}
\usepackage{listings}

\newcommand{\myincludecode}[1]{\lstinputlisting[caption=#1, language=matlab]{#1}}
\newcommand{\mysecondincludecode}[2]{\lstinputlisting[caption={#2}, language=matlab]{#1}}


\begin{document}

\myincludecode{main.m}                        % line 10
\myincludecode{gen_data.m}                    % line 11

\mysecondincludecode{main.m}{main.m}          % line 13
\mysecondincludecode{gen_data.m}{gen\_data.m} % line 14

\end{document}

明らかに、13 行目と 14 行目のコマンドは適切に機能しており、対応するファイルが正しくインクルードされ、対応するキャプションが印刷されます。

10 行目も正常に動作します。ただし、11 行目では対応するファイルが含まれていますが、キャプションは出力されません。ログ ファイルには次のように表示されます。

Try.tex|11 error| Missing $ inserted.
Try.tex|11 error| Extra }, or forgotten $.
Try.tex|11 error| Missing $ inserted.
Try.tex|11 error| Missing } inserted.

アンダースコアによってコマンドが機能しなくなるのは明らかです。そのため、myincludecodeアンダースコアなどの特殊文字が使用されている場合でも、コマンドが機能するように変更するにはどうすればよいかと考えています。

答え1

引数をトークン化解除します。

\documentclass[UTF8]{ctexart}
\usepackage[T1]{fontenc}
\usepackage{listings}

\newcommand{\myincludecode}[1]{\lstinputlisting[caption=\detokenize{#1}, language=matlab]{#1}}

\begin{document}

\myincludecode{main.m}
\myincludecode{gen_data.m} 

\end{document}

ここに画像の説明を入力してください

答え2

アンダースコアにはmathmode機能があります。次の文字を下付き文字に変更します。したがって、符号が必要です$。これは問題に対する簡単な解決策です。

\documentclass[UTF8]{ctexart}
\usepackage{listings}

\begin{document}
\begingroup
\newcommand{\myincludecode}[1]{\catcode`_=11\lstinputlisting[caption=#1, language=matlab]{#1}}
\myincludecode{main.m}
\myincludecode{gen_data.m}
\endgroup
$1_2$
\end{document}

Catcode はカテゴリ コードを意味します。カテゴリは_8 で、何らかの機能が割り当てられます。これを 11 に変更すると、アンダースコアが文字カテゴリに変更されます。これはおそらく必要な動作です。このコマンドを\begingroup&の間に追加すると\endgroup、その範囲外でも下付き文字機能がそのまま残ります。

答え3

ファイル名や cite タグ、ref タグでは「_」を避けるか、アクティブ文字制御機能付きの babel パッケージを使用するか、いくつかのコマンドを再定義しようとする (完全には機能しない可能性がある) [strings] オプションを指定する必要があります。[strings] オプションや babel がなくても、次のようにアンダースコアを時々使用できます: 「\include{file\string_name}」。

デフォルトの操作は非常に単純で、カスタマイズの必要はありません。ただし、LaTeX が引数を何らかの制御関数の文字列または名前として使用する場所では、“_” の使用を避ける必要があります。これには、\cite および \ref のタグ、\input、\include、および \includegraphics のファイル名、環境名、カウンター名、および配置パラメーター ([t] など) が含まれます。これらのコンテキストの問題は、これらが「移動引数」であるにもかかわらず、LaTeX がそれらに対して「\protect メカニズム」を「オン」にしないことです。

これらの場所でアンダースコア文字を使用する必要がある場合は、パッケージ オプション [strings] を使用して、そのような文字列引数を取るコマンドを再定義し、保護を適用します (\protect を \string に変更)。この規定が影響するコマンドのリストは、\UnderscoreCommands に示されています。各コマンドの前には \do が付きます。さらに、\input、\includegraphics、\cite、\ref、およびそれらの派生を含むいくつかのコマンドがあります。

参照してください - http://ctan.imsc.res.in/macros/latex/contrib/underscore/underscore.pdf そして - 名前/パスにアンダースコアを含むファイルのリスト

ここに画像の説明を入力してください ここに画像の説明を入力してください

関連情報