Decodificación de línea codificada en hexadecimal en XeLaTeX

Decodificación de línea codificada en hexadecimal en XeLaTeX

Intentaré adaptarme pax.stya XeLaTeX y descubrí que la URL de .paxlos archivos está codificada como una línea hexadecimal:

\[{annot}{1}{Link}{56.693 693.9 156.107 707.7}{URI}{
  URI={\<6D61696C746F3A68656C6C6F406578616D706C652E636F6D\>},
  Border={[0 0 0]},
}\\

El URI decodificado es (puede ser visto por )mailto:[email protected]xxd -r -p

¿Cómo puedo decodificar una línea hexadecimal en XeLaTeX (de hexadecimal a ascii)?

MWE:

\documentclass{article}
\newcommand{\hextotext}[1]{#1} % ???
\begin{document}
\hextotext{6D61696C746F3A68656C6C6F406578616D706C652E636F6D}
\end{document}

Respuesta1

Puede utilizar \str_set_convert:Nnnnpara convertir de (suponiendo) utf8/hexa utf8:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\str_new:N \l__ivanov_tmpa_str
\NewDocumentCommand \hextotext { o m }
  {
    \str_set_convert:Nxnn \l__ivanov_tmpa_str {#2}
      { utf8/hex } { utf8 }
    \IfValueTF{#1}
      { \str_set_eq:NN #1 \l__ivanov_tmpa_str }
      { \str_use:N \l__ivanov_tmpa_str }
  }
\cs_generate_variant:Nn \str_set_convert:Nnnn { Nx }
\ExplSyntaxOff
\begin{document}

\hextotext{6D61696C746F3A68656C6C6F406578616D706C652E636F6D}

\hextotext[\tmp]{6D61696C746F3A68656C6C6F406578616D706C652E636F6D}
\texttt{\meaning\tmp}

\end{document}

Esto imprime:

ingrese la descripción de la imagen aquí

Respuesta2

En el caso especial "hex aascii" (como se indica en su pregunta) puede, por ejemplo, poner en minúscula toda la secuencia, insertar siempre ^^antes de dos caracteres sucesivos de esta secuencia, y tendrá algo que se interpreta, por ejemplo, como \scantokensla secuencia de caracteres correspondiente en ^^notación -.

\documentclass{article}

\begingroup
\makeatletter
\catcode`\^^A=14\relax
\catcode`\%=12\relax
\@firstofone{^^A
  \endgroup
  \newcommand\hextotext[2]{^^A
    \@ifdefinable#1{^^A
      \lowercase{^^A
        \scantokens\expandafter{^^A
          \expandafter\newcommand\expandafter#1\expandafter{^^A
            \romannumeral\expandafter\hextotextloop\expandafter{\expandafter}\detokenize{#2}\relax\relax
          }%^^A
        }^^A
      }^^A
    }^^A
  }^^A
}%
\begingroup
\makeatletter
\catcode`\^=12\relax
\@firstofone{%
  \endgroup
  \newcommand*\hextotextloop[3]{%
    \ifx\relax#2\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
    {\z@#1}{\hextotextloop{#1^^#2#3}}%
  }%
}%

\begin{document}

%  6D61696C746F3A68656C6C6F406578616D706C652E636F6D

^^6d^^61^^69^^6c^^74^^6f^^3a^^68^^65^^6c^^6c^^6f^^40^^65^^78^^61^^6d^^70^^6c^^65^^2e^^63^^6f^^6d

\hextotext{\MyCommand}{6D61696C746F3A68656C6C6F406578616D706C652E636F6D}

\begingroup

\ttfamily

\string\MyCommand: \meaning\MyCommand

\endgroup

\MyCommand

\end{document}

ingrese la descripción de la imagen aquí

Pero esto es sólo para jugar.

En escenarios de la vida real usaríalo que se proporciona en la respuesta de Phelype Oleinik.Eso cubre la conversión de utf8/hex a utf8, mientras que ASCII (lo que se cubre en mi respuesta) es solo un subconjunto de utf8.

información relacionada