
現状
長い URL は以下のように見栄えが悪くなります。
\documentclass{article}
\usepackage{xcolor,listings}
\lstset
{
language={[LaTeX]TeX},
backgroundcolor=\color{yellow!50},
breaklines=true,
}
\usepackage[colorlinks]{hyperref}
\def\InputCode#1#2{%
\lstinputlisting[caption=\href{#2}{#2}]{#1}}
\begin{document}
\minipage{0.5\linewidth}
\InputCode{\jobname.tex}{http://www.oakfurniturehouse.co.uk/userfiles/image/3B4K1820.jpg}
\endminipage
\end{document}
期待される結果
以下のように、右側から測った特定の長さまで左側の部分をトリミングします。トリミングされた部分は に置き換えられます...
。
minipage
ドキュメント全体で幅が異なる可能性があるため、これを自動的に行う方法。
答え1
まず、補足事項から始めましょう:
- 使用しないでください
\def
- フロントエンドでは使用する方が快適ですxparse
。 \minipage
---のような組み合わせは\endminipage
避けてください。\begin{minipage}
---を使用してください\end{minipage}
。
ここでは、expl3 の利点を活用する提案です。次のメカニズムが使用されます。
- URL を保存し
hbox
、ボックスの幅と必要な幅を比較します。 - URL の幅が長すぎる場合、URL はトークン リストとして保存されます。リストの最初のトークンが削除され、結果が hbox 内に保存されます。次に、1 を参照してください。
ここにコードがあります:
\listfiles
\documentclass{article}
\usepackage{xcolor,listings}
\lstset
{
language={[LaTeX]TeX},
backgroundcolor=\color{yellow!50},
breaklines=true,
}
\usepackage[colorlinks]{hyperref}
\newlength\sideoffset
\setlength\sideoffset{2cm}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \InputCode { m m }
{
\lstinputlisting
[caption=\href{#2}{
\hbox_set:Nn \l_tmpa_box { #2 }
\dim_compare:nNnTF
{ \linewidth - 2\sideoffset} > { \box_wd:N \l_tmpa_box }
{%TRUE
#2
}
{%FALSE
\tl_set:Nx \l_tmpa_tl { \tl_tail:n { #2 } }
\hbox_set:Nn \l_tmpa_box { \tl_use:N \l_tmpa_tl }
\dim_while_do:nNnn { \box_wd:N \l_tmpa_box } > { \linewidth - 2\sideoffset}
{
\tl_set:Nx \l_tmpa_tl { \tl_tail:N \l_tmpa_tl }
\hbox_set:Nn \l_tmpa_box { \tl_use:N \l_tmpa_tl }
}
\ldots \tl_use:N \l_tmpa_tl
}
}
]
{#1}
}
\ExplSyntaxOff
\begin{document}
\begin{minipage}{0.5\linewidth}
\InputCode{\jobname.tex}{http://www.oakfurniturehouse.co.uk/userfiles/image/3B4K1820.jpg}
\end{minipage}
\end{document}