Ich muss die Tiefe einer Zeichenfolge ermitteln. Zu diesem Zweck möchte ich eine Schleife über die Zeichenfolge ausführen und nach der Tiefe jedes Zeichens fragen.
Ich verlange nach einer Tiefe wie dieser:
\dimen=\fontchardp\expandafter\font`\a
Und zwar in einer Schleife wie folgt:
\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
Aber das funktioniert nicht, obwohl ich es mit verschiedenen Kombinationen von \expandafter
: versucht habe:
\dimen=\fontchardp\font`\StrMid{\mystring}{\X}{\X}
Wenn es einfachere Wege gibt,Tiefe einer Saiteich wäre dankbar, würde aber auch gerne wissen, wie ich die vorherige Codezeile zum Laufen bringe. Danke.
Antwort1
DerAntwort von marsupilambeschreibt, wie man die Aufgabe normalerweise erledigen würde: den Inhalt setzen und die Kastentiefe ermitteln.
Es gibt zwei Probleme mit dem Code, den Sie haben. Erstens \dimen
muss auf das TeX-Grundelement eine Registernummer folgen, nicht ein =
. Da es sich \dimen0
bei LaTeX um ein Arbeitsregister handelt, können Sie daher verwenden \dimen0=<some valid dimension>
. Zweitens \StrMid
erzeugt dies keinen Buchstabenan sich(es ist nicht „erweiterbar“), es sind Anweisungen, dies in einem Satzkontext zu tun. Es gibt jedoch ein optionales Argument, das das Gewünschte „zurückgibt“
\StrMid{\mystring}{\X}{\X}[\tmp] % \tmp now expands to the substring
Wir können das mit verwenden, um \expandafter
das zu erhalten, was \fontchardp
erforderlich ist: das ZeichenNummerdu bist interessiert in
\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}
(Ich habe das Ergebnis angezeigt, statt es zu setzen)
Antwort2
Ich weiß nicht, wie Ihr Ansatz mit einer Schleife aussieht, aber um die Tiefe zu erreichen, verwenden Sie einfach\settodepth
Sehen :https://tex.stackexchange.com/a/37294/116936
Sie können das calc
Paket auch verwenden\depthof
\documentclass{article}
\begin{document}
\def\mystring{abcdefgh}
\newlength\myLength
\settodepth{\myLength}{\mystring}
\the\myLength
\end{document}
Prost,
Antwort3
Ähnlich wie bei Joseph, aber mit weniger Code
\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}
Natürlich
\settodepth{\stringdepth}{\mystring}
ist viel effizienter.
Eine andere Schleife, ziemlich flexibel, wie die Beispiele zeigen: Auf das aktuelle Element wird #1
im letzten Argument verwiesen auf \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}
Hier ist die Ausgabe auf dem Terminal (und die Protokolldatei):
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