"Verbatim" 환경 내 일부 라인에 라벨을 부착하는 간단한 방법이 있습니까?

"Verbatim" 환경 내 일부 라인에 라벨을 부착하는 간단한 방법이 있습니까?

내 문서에는 , , , 등 Verbatim내부에 다양한 문자가 포함된 소스 코드가 포함된 환경이 많이 있습니다 . 저는 이러한 환경 내부의 일부 라인에 라벨을 부착하는 방법을 찾으려고 노력하고 있습니다. all 을 및 all 로 바꿔야 하기 때문에 이는 서투른 것처럼 보입니다. 따라서 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}

fancyvrb

참고: PDFLaTeX에서는 UTF8 문자를 값으로 사용할 수 없습니다 commandchars. 그러나 LuaLaTeX와 같은 UTF8 엔진을 사용하면 다음과 같은 것도 가능합니다.

% 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. 이 경우에는 다음만 필요합니다.하나이스케이프 문자, 예:

\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}

그럼에도 불구하고 나는 이 해결책이 너무 쉽게 잘못될 수 있다고 생각하기 때문에 좋아하지 않습니다. 그리고 마지막 두 솔루션 중 하나가 실패할 때마다 코드의 복잡성이 증가합니다. 대조적으로, 예제에서 문자를 변경하는 것은 listings사소한 일입니다.

관련 정보