!["Verbatim" 환경 내 일부 라인에 라벨을 부착하는 간단한 방법이 있습니까?](https://rvso.com/image/472703/%22Verbatim%22%20%ED%99%98%EA%B2%BD%20%EB%82%B4%20%EC%9D%BC%EB%B6%80%20%EB%9D%BC%EC%9D%B8%EC%97%90%20%EB%9D%BC%EB%B2%A8%EC%9D%84%20%EB%B6%80%EC%B0%A9%ED%95%98%EB%8A%94%20%EA%B0%84%EB%8B%A8%ED%95%9C%20%EB%B0%A9%EB%B2%95%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
내 문서에는 , , , 등 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}
참고: 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}
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
사소한 일입니다.