字串中字元的最大深度

字串中字元的最大深度

我需要找到字串的深度,為此我想循環字串並詢問每個字元的深度。

我要求這樣的深度:

\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 提供的答案涵蓋了通常如何完成任務:排版內容並獲取框架深度。

您獲得的代碼有兩個問題。首先,TeX 原語後面\dimen必須跟一個暫存器號,而不是=.利用\dimen0LaTeX 中的暫存寄存器這一事實,您可以使用\dimen0=<some valid dimension>.第二個是\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/372​​94/116936

您也可以使用該calc套件\depthof

\documentclass{article}

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

\settodepth{\myLength}{\mystring}

\the\myLength
\end{document}

乾杯,

答案3

與 Joseph 類似,但使用更少的程式碼

\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

相關內容