Как автоматически обрезать URL-адрес до определенной длины, измеренной справа?

Как автоматически обрезать URL-адрес до определенной длины, измеренной справа?

Нынешнее состояние

Длинный 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. Используется следующий механизм:

  1. Сохраните URL-адрес в файле hboxи сравните ширину поля с требуемой шириной.
  2. Если ширина 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}

Связанный контент