
Ich habe Code, in den ich Hyperlinks einfügen möchte. Ich verwende das „Listings-Paket“. Ich möchte, dass der Code mit und ohne Hyperlinks identisch aussieht. Andernfalls möchte ich den Unterschied im Abstand feststellen können, da ich die tabellarische Ausrichtung auf etwa 80 Zeichen beschränken möchte.
Ich verwende Escape-Sequenzen zum Einfügen der Hyperlinks, aber der Zeichenabstand ändert sich.
Das folgende MWE verfügt nicht über einen Hyperlink, zeigt aber, dass der Zeichenabstand unterschiedlich ist.
\documentclass{article}
\usepackage{listings,chngcntr}
\lstset{
escapeinside={/*!}{!*/},
basicstyle=\scriptsize\ttfamily,
}
\begin{document}
\begin{lstlisting}[]
FooBar
/*!{\scriptsize\ttfamily FooBar}!*/
\end{lstlisting}
\end{document}
Es gibt oft mehr als eine Escape-Sequenz in derselben Zeile, wodurch die Ausrichtung stark beeinträchtigt werden kann.
Antwort1
Eine Möglichkeit wäre, zu verwenden. columns=fullflexible
Dann entspricht der Abstand in der Auflistung mehr oder weniger dem normalen Schriftsatz.
\documentclass{article}
\usepackage{listings,chngcntr}
\lstset{
escapeinside={/*!}{!*/},
basicstyle=\scriptsize\ttfamily,
columns=fullflexible
}
\begin{document}
\begin{lstlisting}[]
FooBar
/*!{\scriptsize\ttfamily FooBar}!*/
\end{lstlisting}
\end{document}
Die Alternative besteht darin, den Schriftsatz im Escape zu vermeiden. Sie müssten dann die Erweiterung des Links beispielsweise mithilfe von zref-savepos berechnen. Das Folgende setzt voraus, dass die URL keine problematischen Zeichen enthält und daher sicher in einem Argument verwendet werden kann:
\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}