Manter a formatação exata em uma listagem com sequências de escape de hiperlink

Manter a formatação exata em uma listagem com sequências de escape de hiperlink

Tenho algum código no qual desejo colocar hiperlinks. Estou usando o 'pacote de listagens'. Gostaria que o código parecesse idêntico, com e sem hiperlinks. Caso contrário, gostaria de poder determinar a diferença no espaçamento, pois desejo manter o alinhamento tabular em cerca de 80 caracteres.

Estou usando sequências de escape para inserir os hiperlinks, mas o espaçamento entre caracteres muda.

O MWE abaixo não possui hiperlink, mas ilustra que o espaçamento entre caracteres é diferente.

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

Freqüentemente, há mais de uma sequência de escape na mesma linha e as coisas podem ficar muito desalinhadas.O espaçamento é mais restrito na versão com escape

Responder1

Uma maneira seria usar columns=fullflexibleo espaçamento na listagem mais ou menos como a composição 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}  

insira a descrição da imagem aqui

A alternativa é evitar fazer composição tipográfica no escape, então você teria que calcular a extensão do link por exemplo com a ajuda de zref-savepos. O seguinte pressupõe que o URL não contém caracteres problemáticos e, portanto, pode ser usado com segurança em um 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}  

insira a descrição da imagem aqui

informação relacionada