Mantener el formato exacto en una lista con secuencias de escape de hipervínculos

Mantener el formato exacto en una lista con secuencias de escape de hipervínculos

Tengo un código en el que deseo colocar hipervínculos. Estoy usando el 'paquete de listados'. Me gustaría que el código se viera idéntico, con y sin hipervínculos. De lo contrario, me gustaría poder determinar la diferencia en el espaciado, ya que quiero mantener la alineación tabular en aproximadamente 80 caracteres.

Estoy usando secuencias de escape para insertar los hipervínculos, pero el espacio entre caracteres cambia.

El MWE a continuación no tiene un hipervínculo, pero ilustra que el espaciado entre caracteres es diferente.

\documentclass{article}
\usepackage{listings,chngcntr}
\lstset{
 escapeinside={/*!}{!*/},
 basicstyle=\scriptsize\ttfamily,
 }
\begin{document}
\begin{lstlisting}[]
FooBar
/*!{\scriptsize\ttfamily FooBar}!*/
\end{lstlisting}
\end{document}  

A menudo hay más de una secuencia de escape en la misma línea y las cosas pueden desalinearse mucho.El espaciado es más ajustado en la versión de escape.

Respuesta1

Una forma sería utilizar columns=fullflexibleentonces el espaciado en la lista será más o menos similar a la composición tipográfica normal.

\documentclass{article}
\usepackage{listings,chngcntr}
\lstset{
 escapeinside={/*!}{!*/},
 basicstyle=\scriptsize\ttfamily,
 columns=fullflexible
 }
\begin{document}
\begin{lstlisting}[]
FooBar
/*!{\scriptsize\ttfamily FooBar}!*/
\end{lstlisting}
\end{document}  

ingrese la descripción de la imagen aquí

La alternativa es evitar escribir en el escape, entonces tendrías que calcular la extensión del enlace, por ejemplo, con la ayuda de zref-savepos. Lo siguiente supone que la URL no contiene caracteres problemáticos y, por lo tanto, puede usarse de forma segura en un argumento:

\documentclass{article}
\usepackage{listings,chngcntr,xfp}
\lstset{
 escapeinside={/*!}{!*/},
 basicstyle=\scriptsize\ttfamily,
 }
\usepackage{zref-savepos,zref-user}
\usepackage{hyperref}
\newcommand\linklabels[3]{\rlap{\href{#1}{\strut\hspace*{\inteval{\zposx{#3}-\zposx{#2}}sp}}}}
\begin{document}
\begin{lstlisting}[]
FooBar
/*!\zsavepos{a}\linklabels{https://www.latex-project.org}{a}{b}!*/FooBar/*!\zsavepos{b}!*/
\end{lstlisting}
\end{document}  

ingrese la descripción de la imagen aquí

información relacionada