breaklines=true인 경우 구분 기호로 닫는 괄호가 일치하지 않습니다.

breaklines=true인 경우 구분 기호로 닫는 괄호가 일치하지 않습니다.

괄호 안의 코드와 괄호 안의 코드를 다른 색상으로 표시하고 싶습니다. 다음 문서에서는 다음 단어를 사용합니다.다시 괄호의도한 대로 녹색으로 표시됩니다.다시 밖에서의도한 대로 검은색이지만 페이지 여백까지 늘어납니다.

줄의 주석 처리를 제거하면 ,breaklines=true줄이 사이에 끊어집니다.괄호그리고다시그러나 이 단어와 그 다음은 빨간색입니다. 즉, (- )로 구분된 섹션이 감지되었지만 닫는 부분이 )무시된 것처럼 보입니다.

여기서 무슨 일이 일어나고 있는 걸까요?

덧셈:줄바꿈이 없는 경우에도 문제가 발생합니다. 예를 들어 텍스트의 모든 단어를 첫 글자로 줄이는 경우입니다. ()예를 들어 . 대신 다른 종류의 구분 기호를 선택하면 문제가 사라집니다 {}.

\documentclass{article}
\usepackage{color}
\usepackage{listings}

\lstdefinelanguage{new}{
    moredelim=*[s][\color{red}]{(}{)},
    moredelim=*[s][\color{green}]{[}{]},
  }
\lstset{
  language=new
  %,breaklines=true
  }

\begin{document}

\begin{figure}
\begin{lstlisting}
outside(in paren) [in brackets (paren+brackets) brackets again] outside again
\end{lstlisting}
\end{figure}

\end{document}

답변1

줄 바꿈 알고리즘에 의한 오른쪽 괄호의 특수 처리로 인해 발생하는 버그를 발견했을 수도 있습니다.listings패키지. 실제로 패키지 SelectCharTable에서 사용하는 Hook이 listings실행되고 줄 바꿈이 활성화되면 )매크로로 정의됩니다.

\lst@Def{`)}{\lst@breakProcessOther)}

어디

\lst@Def=macro:
#1->\lccode `\~=#1\lowercase {\def ~}.

불행하게도 이는 )더 이상 구분 기호로 인식되지 않으며 결국 관찰하게 됩니다.

이 버그에 대한 수정 사항을 찾으려고 노력했지만 지금까지 성공하지 못했습니다. (제 TeX 프로그래밍 기술은 여전히 ​​제한적입니다.) 따라서 제가 지금 제공할 수 있는 유일한 방법은 )줄 바꿈 알고리즘 의 특수 처리를 취소하는 패치 형태의 해결 방법뿐입니다 .

\documentclass{article}

\usepackage{color}

\usepackage{listings}

\lstdefinelanguage{new}{
  moredelim=*[s][\color{red}]{(}{)},
  moredelim=*[s][\color{green}]{[}{]},
}

\lstset{
  language=new,
  breaklines=true
}

\usepackage{etoolbox}

\makeatletter

\patchcmd{\lsthk@SelectCharTable}{%
  \lst@ifbreaklines\lst@Def{`)}{\lst@breakProcessOther)}\fi
}{%
}{
}{
}

\makeatother

\begin{document}

\begin{lstlisting}
outside (in paren) [in brackets (paren+brackets) brackets again] outside again
\end{lstlisting}

\end{document}

결과 출력은 다음과 같습니다.

답변2

간단한 해결 방법은 닫는 괄호 ')'를 사용하는 대신 ']'와 같은 다른 문자를 사용하고 이를 닫는 괄호 ')'로 바꾸는 것입니다.

\begin{lstlisting[literate={(}{{\textbf{(}}}1                          
                           {]}{{\textbf{)}}}1]
(In text I'm closing using]
\end{lstlisting}

관련 정보