「Verbatim」環境内のいくつかの行にラベルを付ける簡単な方法はありますか?

「Verbatim」環境内のいくつかの行にラベルを付ける簡単な方法はありますか?

ドキュメントには、、、、などVerbatim、内部にさまざまな文字を含むソース コードを含む環境が多数あります。これらの環境内の一部の行にラベルを付ける方法を探しています。これは、すべてを に、すべてを に置き換える必要があるため、不格好に見えます。そのため、Java コードの可読性が大幅に低下します (ドキュメントの編集者である私にとって)。{([<{\{}\}

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[commandchars=\\\{\}]
void main() \{
  print("Hello!"); \label{foo}
\}
\end{Verbatim}
\end{document}

次のようなもののほうがずっと良いでしょう:

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}
void main() {
  print("Hello!"); !foo
}
\end{Verbatim}
\end{document}

を としてfancyvrb解釈することはどういうわけか可能ですか? ( の「ハック」が必要であれば問題ありません)!foo\label{foo}fancyvrb

答え1

適切な定義を使用して をアクティブに設定できます!。 は英数字を検索し、それを に引数として渡します\label

\documentclass{article}
\usepackage{fancyvrb}

\ExplSyntaxOn

\cs_new_protected:Nn \__yegor_verbatim_label:
 {
  \peek_regex_replace_once:nn { [[:alnum:]]* } { \c{label}\cB\{\0\cE\} }
 }
\char_set_active_eq:nN { `! } \__yegor_verbatim_label:

\ExplSyntaxOff

\begin{document}

\begin{Verbatim}[codes={\catcode`\!=\active}]
void main() {
  print("Hello!"); !foo
}
\end{Verbatim}

\end{document}

ファイルには次の内容が含まれています.aux:

\newlabel{foo}{{2}{1}{}{}{}}

答え2

コードで使用されていない別のグループ文字を使用できます。例:

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[{commandchars=\\[]}]
void main() {
  print("Hello!"); \label[foo]
}
\end{Verbatim}
\end{document}

または

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[{commandchars=\\$/}]
void main() {
  print("Hello!"); \label$foo/
}
\end{Verbatim}
\end{document}

ファンシーvrb

注意: PDFLaTeX では、 の値として UTF8 文字を使用することはできませんcommandchars。ただし、UTF8 エンジン (例: LuaLaTeX) では、次のようになります。

% This is a LuaLaTeX example!
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[{commandchars=§«»}]
void main() {
  print("Hello!"); §label«foo»
}
\end{Verbatim}
\end{document}

に使える。


もう一つの選択肢はパッケージlistingsの代わりにfancyvrb。この場合、必要なのは1つエスケープ文字、例:

\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}[escapechar=~]
void main() {
  print("Hello!"); ~\label{foo}~
}
\end{lstlisting}
\end{document}

あるいは:

\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}[escapechar=¡]
void main() {
  print("Hello!"); ¡\label{foo}¡
}
\end{lstlisting}
\end{document}

リスト

または

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstset{columns=flexible,basicstyle=\ttfamily,identifierstyle=\color{blue}}
\begin{document}
\begin{lstlisting}[language=Java,escapechar=¡]
void main() {
  print("Hello!"); ¡\label{foo}¡
}
\end{lstlisting}
\end{document}

色付きのJavaコード

listingsコード内ですべての文字を使用する必要がある場合でも、行番号を参照するその他のヒントと代替方法については、マニュアルのセクション 8 も参照してください。


!コード内でを として使用する必要がある場合\label、ただし が後に続かない場合にのみ、 を追加して"を区切ることをお勧めします。foo!

\documentclass{article}
\usepackage{fancyvrb}
\makeatletter
\let\!!
\begingroup
\catcode`\!=\active
\gdef!{\@ifnextchar"{\!}{\labeltill}}
\gdef\labeltill#1!{\label{#1}}
\endgroup
\makeatother
\begin{document}
\begin{Verbatim}[codes*={\catcode`\!\active}]
void main() {
  print("Hello!"); !foo!
}
\end{Verbatim}
\end{document}

ただし、コードの一部として使用されることのない文字を使用する方がよいでしょう。

\documentclass{article}
\usepackage{fancyvrb}
\begingroup
\catcode`\^=\active
\gdef^#1^{\label{#1}}
\endgroup
\begin{document}
\begin{Verbatim}[codes*={\catcode`\^\active}}
void main() {
  print("Hello!"); ^foo^
}
\end{Verbatim}
\end{document}

それでも、この解決策は簡単に失敗する可能性があると思うので、私は好きではありません。また、最後の 2 つの解決策のいずれかが失敗するたびに、コードの複雑さが増します。対照的に、listings例の文字を変更するのは些細なことです。

関連情報