
У меня есть код, в который я хочу поместить гиперссылки. Я использую 'listings package'. Я хотел бы, чтобы код выглядел одинаково, с гиперссылками и без них. Если это невозможно, я хотел бы иметь возможность определять разницу в интервалах, так как я хочу сохранить табличное выравнивание примерно до 80 символов.
Я использую escape-последовательности для вставки гиперссылок, но интервал между символами меняется.
В приведенном ниже примере MWE нет гиперссылки, но он иллюстрирует другой интервал между символами.
\documentclass{article}
\usepackage{listings,chngcntr}
\lstset{
escapeinside={/*!}{!*/},
basicstyle=\scriptsize\ttfamily,
}
\begin{document}
\begin{lstlisting}[]
FooBar
/*!{\scriptsize\ttfamily FooBar}!*/
\end{lstlisting}
\end{document}
Часто в одной строке присутствует несколько последовательностей переходов, и все может сильно разбалансироваться.
решение1
Одним из способов было бы использование этого метода, columns=fullflexible
тогда интервал в листинге будет более или менее как при обычном наборе текста.
\documentclass{article}
\usepackage{listings,chngcntr}
\lstset{
escapeinside={/*!}{!*/},
basicstyle=\scriptsize\ttfamily,
columns=fullflexible
}
\begin{document}
\begin{lstlisting}[]
FooBar
/*!{\scriptsize\ttfamily FooBar}!*/
\end{lstlisting}
\end{document}
Альтернативой является избежание набора текста в escape, тогда вам придется вычислять расширение ссылки, например, с помощью zref-savepos. Ниже предполагается, что url не содержит проблемных символов и поэтому может быть безопасно использован в аргументе:
\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}