Наибольшая глубина символа в строке

Наибольшая глубина символа в строке

Мне нужно найти глубину строки, для этого я хотел бы обойти строку и запросить глубину каждого символа.

Я прошу о такой глубине:

\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

Theответ от marsupilamописывает, как обычно выполняется эта задача: набирается содержимое и определяется глубина поля.

В коде, который у вас есть, есть две проблемы. Во-первых, за примитивом TeX \dimenдолжен следовать номер регистра, а не =. Используя тот факт, что \dimen0это регистр скретча в LaTeX, вы, следовательно, можете использовать \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

Похож на Джозефа, но использует меньше кода

\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

Связанный контент