![El paréntesis de cierre como delimitador no coincide cuando líneas de corte = verdadero](https://rvso.com/image/254701/El%20par%C3%A9ntesis%20de%20cierre%20como%20delimitador%20no%20coincide%20cuando%20l%C3%ADneas%20de%20corte%20%3D%20verdadero.png)
Quiero que el código entre paréntesis y entre paréntesis aparezca en diferentes colores. En el siguiente documento, las palabrasparéntesis de nuevoaparecer en verde como se esperaba, yafuera otra vezes negro como se esperaba, pero se extiende hasta el margen de la página.
Si descomento la línea ,breaklines=true
, la línea se divide entresoportesyde nuevo, sin embargo, estas palabras y las siguientes están en rojo, es decir, como si se detectara una sección delimitada pero luego se ignorara el (
cierre .)
)
¿Que esta pasando aqui?
Suma:El problema también ocurre si no hay un salto de línea, por ejemplo, si acorto todas las palabras del texto a su primera letra. El problema desaparece en cualquier caso si elijo cualquier otro tipo de delimitador en lugar de ()
, por ejemplo {}
.
\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}
Respuesta1
Es posible que se haya encontrado con un error que surge del tratamiento especial del paréntesis derecho por parte del algoritmo de salto de línea dellistings
paquete. De hecho, cuando se ejecuta el SelectCharTable
gancho utilizado por el paquete y se habilita el salto de línea , se define como una macro, es decir, porlistings
)
\lst@Def{`)}{\lst@breakProcessOther)}
dónde
\lst@Def=macro:
#1->\lccode `\~=#1\lowercase {\def ~}.
Desafortunadamente, esto significa que )
ya no se reconoce como delimitador, lo que finalmente conduce a su observación.
Me he esforzado un poco en encontrar una solución para este error, pero hasta ahora no lo he logrado. (Mis habilidades de programación TeX aún son limitadas). Entonces, lo único que puedo ofrecer ahora es una solución alternativa en forma de parche que simplemente cancela el tratamiento especial del )
algoritmo de salto de línea:
\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}
La salida resultante es:
Respuesta2
Una solución alternativa simple sería, en lugar de usar el paréntesis de cierre ')', se puede usar otro carácter, por ejemplo, ']' y reemplazarlo con el paréntesis de cierre ')'.
\begin{lstlisting[literate={(}{{\textbf{(}}}1
{]}{{\textbf{)}}}1]
(In text I'm closing using]
\end{lstlisting}