
ハイパーリンクを配置したいコードがあります。「リスト パッケージ」を使用しています。ハイパーリンクの有無にかかわらず、コードが同一に見えるようにしたいと思います。それができない場合は、表の配置を約 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}