¿Cómo recortar automáticamente una URL hasta una determinada longitud medida desde la derecha?

¿Cómo recortar automáticamente una URL hasta una determinada longitud medida desde la derecha?

Condición actual

Una URL larga se ve mal de la siguiente manera.

ingrese la descripción de la imagen aquí

\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}

Resultado Esperado

Quiero recortar la parte izquierda hasta una cierta longitud medida desde la derecha de la siguiente manera. La parte recortada será reemplazada por ....

ingrese la descripción de la imagen aquí

Cómo hacer esto automáticamente porque el minipageancho puede variar a lo largo de mi documento.

Respuesta1

Permítanme comenzar con algunas notas al margen:

  • no lo use \def: en la interfaz es más cómodo de usar xparse.
  • Deben evitarse combinaciones como \minipage--- . \endminipageUsar \begin{minipage}--- \end{minipage}.

Aquí una sugerencia utilizando los beneficios de expl3. Se utiliza el siguiente mecanismo:

  1. Guarde la URL en un hboxy compare el tamaño del cuadro con el ancho requerido.
  2. Si el ancho de la URL es demasiado largo, la URL se guardará como una lista de tokens. Ahora se eliminará el primer token de la lista y el resultado se guardará dentro de un hbox. Y ahora mira 1.

Aquí el código:

\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}

información relacionada