文字列の深さを見つける必要があります。そのためには、文字列をループして各文字の深さを尋ねたいと思います。
私は次のように深さを求めます:
\dimen=\fontchardp\expandafter\font`\a
そして次のようにループします:
\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
しかし、以下のさまざまな組み合わせを試しても、これは機能しません\expandafter
。
\dimen=\fontchardp\font`\StrMid{\mystring}{\X}{\X}
もっと簡単な方法があれば文字列の深さありがたいのですが、前のコード行を機能させる方法も知りたいです。ありがとうございます。
答え1
のmarsupilam による回答通常のタスクの達成方法、つまりコンテンツをタイプセットしてボックスの深さを取得する方法について説明します。
あなたが持っているコードには2つの問題があります。まず、TeXプリミティブ\dimen
の後にレジスタ番号が続く必要があり、 が続くことはありません。 はLaTeXのスクラッチレジスタである=
という事実を利用して\dimen0
、 を使用することができます\dimen0=<some valid dimension>
。2つ目は、\StrMid
が文字を生成しないことです。それ自体(「拡張可能」ではない)これは、タイプセッティングのコンテキストでそれを行うための指示です。ただし、必要な値を「返す」オプションの引数があります。
\StrMid{\mystring}{\X}{\X}[\tmp] % \tmp now expands to the substring
これを次のように使用して、必要な文字\expandafter
を取得できます\fontchardp
。番号に興味があります
\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}
(結果をタイプセットするのではなく表示しました)
答え2
ループを使ったアプローチについては分かりませんが、深さを取得するには、\settodepth
見る :https://tex.stackexchange.com/a/37294/116936
calc
パッケージを使用することもできます\depthof
\documentclass{article}
\begin{document}
\def\mystring{abcdefgh}
\newlength\myLength
\settodepth{\myLength}{\mystring}
\the\myLength
\end{document}
乾杯、
答え3
ジョセフのものと似ていますが、使用するコードが少なくなっています
\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}
もちろん
\settodepth{\stringdepth}{\mystring}
はるかに効率的です。
例に示されているように、非常に柔軟な別のループ: 現在の項目は、#1
の最後の引数でとして参照されます\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}
ターミナル (およびログ ファイル) の出力は次のとおりです。
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