문자열에서 문자의 최대 깊이

문자열에서 문자의 최대 깊이

문자열의 깊이를 찾아야 합니다. 이를 위해 문자열을 반복하여 모든 문자의 깊이를 요청하고 싶습니다.

나는 다음과 같이 깊이를 요구합니다.

\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/37294/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

관련 정보