Mayor profundidad de un carácter en una cadena.

Mayor profundidad de un carácter en una cadena.

Necesito encontrar la profundidad de una cadena, para ello me gustaría recorrer la cadena y preguntar por la profundidad de cada carácter.

Pido profundidad así:

\dimen=\fontchardp\expandafter\font`\a

Y bucle así:

\def\mystring{abcdefgh}
\StrLen{\mystring}[\len]
\newcount\X \X=\len

\loop
\StrMid{\mystring}{\X}{\X}\par    
\advance \X by -1
\unless\ifnum \X<1
\repeat

Pero esto no funciona, aunque lo intenté con diferentes combinaciones de \expandafter:

\dimen=\fontchardp\font`\StrMid{\mystring}{\X}{\X}

Si hay maneras más fáciles de conseguirprofundidad de una cuerdaLo agradecería, pero también me gustaría saber cómo hacer que funcione la línea de código anterior. Gracias.

Respuesta1

Elrespuesta de marsupilamcubre cómo uno normalmente realizaría la tarea: componer el contenido y obtener la profundidad del cuadro.

Hay dos problemas con el código que tienes. Primero, la primitiva TeX \dimendebe ir seguida de un número de registro, no de un archivo =. Dado que \dimen0es un registro reutilizable en LaTeX, puede utilizar \dimen0=<some valid dimension>. El segundo es que\StrMid no genera letra.per se(no es 'ampliable'), son instrucciones para hacerlo en un contexto de composición tipográfica. Sin embargo, hay un argumento opcional que "devolverá" lo que desea.

\StrMid{\mystring}{\X}{\X}[\tmp] % \tmp now expands to the substring

Podemos usarlo para \expandafterobtener lo que\fontchardp requiere: el personaje.númeroEstas interesado en

\documentclass{article}
\usepackage{xstring}

\begin{document}

\def\mystring{abcdefgh}
\StrLen{\mystring}[\len]
\newcount\X
\X=\len

\loop
  \StrMid{\mystring}{\X}{\X}[\tmp]
  \dimen0=\fontchardp\expandafter\font\expandafter`\tmp
  \edef\x{\tmp\space\the\dimen0 }%
  \show\x
  \advance \X by -1 %
  \unless\ifnum \X<1 %
\repeat

\end{document}

(He mostrado el resultado en lugar de escribirlo)

Respuesta2

No conozco tu enfoque usando un bucle, pero para obtener la profundidad, solo usa\settodepth

Ver :https://tex.stackexchange.com/a/37294/116936

También puedes usar el calcpaquete.\depthof

\documentclass{article}

\begin{document}
\def\mystring{abcdefgh}
\newlength\myLength

\settodepth{\myLength}{\mystring}

\the\myLength
\end{document}

Salud,

Respuesta3

Similar al de Joseph, pero usando menos código.

\documentclass{article}
\usepackage{xstring}

\newcount\X
\newdimen\stringdepth

\begin{document}

\def\mystring{abcdefgh}
\StrLen{\mystring}[\len]

\X=0
\stringdepth=0pt

\loop
  \ifnum\len>\X
  \advance\X by 1
  \StrChar{\mystring}{\X}[\tmp]%
  \begingroup\edef\x{\endgroup
    \dimen0=\fontchardp\font`\tmp\relax
  }\x
  \ifdim\dimen0>\stringdepth \stringdepth=\dimen0 \fi
  % just for showing the work
  \typeout{\tmp\space has depth \the\dimen0 }%
\repeat

\typeout{Max depth: \the\stringdepth}

\end{document}

Por supuesto

\settodepth{\stringdepth}{\mystring}

es mucho más eficiente.

Un bucle diferente, bastante flexible, como lo muestran los ejemplos: #1en el argumento final se hace referencia al elemento actual como \stringloop:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\stringloop}{smm}
 {
  \IfBooleanTF{#1}
   { % we have a macro as argument
    \tl_map_inline:Nn #2 { #3 }
   }
   { % an explicit token list
    \tl_map_inline:nn { #2 } { #3 }
   }
 }
\ExplSyntaxOff

\newdimen\stringdepth

\begin{document}

\def\mystring{abcdefgh}

\stringloop{abcdefgh}{\typeout{#1 has depth \the\fontchardp\font`#1}}

\stringdepth=0pt
\stringloop*{\mystring}{%
  \ifdim\fontchardp\font`#1>\stringdepth
    \stringdepth=\fontchardp\font`#1\relax
  \fi
}
\typeout{Max depth in \mystring: \the\stringdepth}

\end{document}

Aquí está el resultado en la terminal (y el archivo de registro):

a has depth 0.0pt
b has depth 0.0pt
c has depth 0.0pt
d has depth 0.0pt
e has depth 0.0pt
f has depth 0.0pt
g has depth 1.94444pt
h has depth 0.0pt
Max depth in abcdefgh: 1.94444pt

información relacionada