Größte Tiefe eines Zeichens in einer Zeichenfolge

Größte Tiefe eines Zeichens in einer Zeichenfolge

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 \dimenmuss auf das TeX-Grundelement eine Registernummer folgen, nicht ein =. Da es sich \dimen0bei LaTeX um ein Arbeitsregister handelt, können Sie daher verwenden \dimen0=<some valid dimension>. Zweitens \StrMiderzeugt 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 \expandafterdas zu erhalten, was \fontchardperforderlich 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 calcPaket 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 #1im 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

verwandte Informationen