
如何使用定義新長度:
\newlength{...}
\setlength{...}{...}
並等於特定字體的行高(例如\tiny\ttfamily
)
注意:我想要一個不涉及在該\begin{document}\end{document}
部分中編寫任何內容的解決方案。
答案1
這將在所有字元(從 0 到 255)上循環,因此它僅適用於pdflatex
; XeLaTeX 或 LuaLaTeX 需要一些不同的啟發式方法fontspec
。
長度\fonttotalheight
定義為高度加深度,除非*
使用 -variant,它將僅測量高度,忽略下降部分。
\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\newlength{\fonttotalheight}
\makeatletter
\newcommand{\setfonttotalheight}{%
\@ifstar{\@tempswafalse\setfont@totalheight}%
{\@tempswatrue\setfont@totalheight}%
}
\newcommand{\setfont@totalheight}[1][]{%
\sbox{\z@}{%
\normalfont
#1% it should be a font selection command
\selectfont
\count@=\z@
\loop
\char\count@
\ifnum\count@<\@cclv
\advance\count@\@ne
\repeat
}%
\setlength\fonttotalheight{\ht\z@}%
\if@tempswa\addtolength\fonttotalheight{\dp\z@}\fi
}
\makeatother
\setfonttotalheight*
\begin{document}
Initial value: \texttt{\the\fonttotalheight} (only height)
\bigskip
\begingroup
Fontencoding: OT1
\fontencoding{OT1}\selectfont
\setfonttotalheight*
Normal font (only height): \texttt{\the\fonttotalheight}
\setfonttotalheight
Normal font (height and depth): \texttt{\the\fonttotalheight}
\setfonttotalheight[\ttfamily]
Typewriter type (height and depth): \texttt{\the\fonttotalheight}
\endgroup
\bigskip
Fontencoding: T1
\setfonttotalheight*
Normal font (only height): \texttt{\the\fonttotalheight}
\setfonttotalheight
Normal font (height and depth): \texttt{\the\fonttotalheight}
\setfonttotalheight[\ttfamily]
Typewriter type (height and depth): \texttt{\the\fonttotalheight}
\end{document}
答案2
我嘗試了該\totalheightof
命令並將長度的定義及其設定包裝到命令中。希望這會有所幫助!
\documentclass[12pt]{scrbook}
\usepackage{etoolbox}
\usepackage{ifmtarg}
\usepackage{calc}
\def\FontHeightDummyText{ABBAASAADSDAgss,qppptssdfaf23l4j324jl234jklsjdflsdkfjslakfjslfsdajfdsljfslkdfjl23k42j34}
\makeatletter
\providecommand{\ProvideLength}[2][]{%
% Check, if the command is already defined, if not, then define it!
\ifdeflength{#2}{% It is already defined!
\GenericWarning{}{Warning: Length #2 already defined!!!!!!!!} % Optional
}{% Not defined, so define it!
\newlength{#2}%
}%
\@ifmtarg{#1}{% is 1st argument empty -> do not set the length at all!
}{% Set the length to the value of the 1st argument.
\setlength{#2}{#1}%
}% End of \@ifmtarg
}% End of \providecommand
\makeatother
% Setting the length as 1st parameter and initialize it
% with the value of the second arg. (hopefully a length ;-))
\newrobustcmd{\SetHeightFromTextTemplate}[2]{%
\ProvideLength[\totalheightof{#2}]{#1}%
}%
%\SetHeightFromTextTemplate{} can be done here also
\begin{document}
\begin{flushleft}
\SetHeightFromTextTemplate{\FontHeight}{\FontHeightDummyText}
Height of font is \the\FontHeight
Using \(\backslash\)Large \Large
%%% Recalculate
\SetHeightFromTextTemplate{\FontHeight}{\FontHeightDummyText}
%\setlength{\FontHeight}{\totalheightof{\FontHeightDummyText}}
Height of font is \the\FontHeight
Now with \begin{verbatim}\tiny\ttfamily:\end{verbatim}
\begingroup
\tiny\ttfamily
%%% Recalculate
\SetHeightFromTextTemplate{\FontHeight}{\FontHeightDummyText}
Height of font is \the\FontHeight
\endgroup
\end{flushleft}
\end{document}