ハイパーリンクのエスケープシーケンスを使用してリスト内の正確な書式を維持する

ハイパーリンクのエスケープシーケンスを使用してリスト内の正確な書式を維持する

ハイパーリンクを配置したいコードがあります。「リスト パッケージ」を使用しています。ハイパーリンクの有無にかかわらず、コードが同一に見えるようにしたいと思います。それができない場合は、表の配置を約 80 文字に維持したいので、間隔の違いを判断できるようにしたいと思います。

エスケープ シーケンスを使用してハイパーリンクを挿入していますが、文字間隔が変わります。

以下の MWE にはハイパーリンクはありませんが、文字間隔が異なることを示しています。

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

同じ行に複数のエスケープ シーケンスが存在することが多く、位置合わせがずれることがあります。エスケープバージョンでは間隔が狭くなります

答え1

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}  

ここに画像の説明を入力してください

代替案としては、エスケープでのタイプセットを避けることです。その場合、たとえば 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}  

ここに画像の説明を入力してください

関連情報