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 \dimen
debe ir seguida de un número de registro, no de un archivo =
. Dado que \dimen0
es 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 \expandafter
obtener 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 calc
paquete.\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: #1
en 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