expl3 / setlength 在 expl3 的前言中不起作用

expl3 / setlength 在 expl3 的前言中不起作用

我正在编写一个应该输出印刷尺寸的包。例如绝对字符高度、x 高度、平均字符宽度……这些应该在序言中提供。

\documentclass[12pt]{scrartcl}
\usepackage{fontspec}
\usepackage{expl3} % load latex3 packages
\usepackage{xparse}

\setmainfont{Linux Libertine O}
\setsansfont[Scale=MatchLowercase]{Linux Biolinum O}
\setmonofont[Scale=MatchLowercase]{Droid Sans Mono}

\newlength{\totalheight}

\ExplSyntaxOn
\tl_const:Nn \c_typo_height_chars_tl {HIyjqpg}

\cs_new_protected:Npn \typo_set_totalheight:Nn #1#2 {
    \group_begin:
        \vbox_set:Nn \l_tmpa_box { #2 \c_typo_height_chars_tl }
        \exp_args:NNNe
    \group_end:
    \dim_set:Nn #1 { \dim_eval:n { \box_ht_plus_dp:N \l_tmpa_box } }
}
\exp_args_generate:n {NNe}


\typo_set_totalheight:Nn \totalheight {}
\ExplSyntaxOff

\begin{document}
\the\totalheight
\end{document}

但我得到了错误

! LaTeX Error: Missing \begin{document}.

我做错了什么?

答案1

\typo_set_totalheight:Nn使用两个参数进行定义,但只提供了一个参数,TeX 会将其\ExplSyntaxOff作为第二个参数提取。混乱随之而来。

\documentclass[12pt]{scrartcl}
\usepackage{fontspec}

\newlength{\totalheight}

\ExplSyntaxOn
\tl_const:Nn \c_typo_height_chars_tl {HIyjqpg}

\cs_new_protected:Npn \typo_set_totalheight:Nn #1#2 {
    \group_begin:
        \hbox_set:Nn \l_tmpa_box { #2 \c_typo_height_chars_tl }
        \exp_args:NNNe
    \group_end:
    \dim_set:Nn #1 { \dim_eval:n { \box_ht_plus_dp:N \l_tmpa_box } }
}
\exp_args_generate:n { NNe }

\AtBeginDocument{\typo_set_totalheight:Nn \totalheight {} }
\ExplSyntaxOff

\begin{document}
\the\totalheight
\end{document}

无需加载expl3xparse使用最新的 LaTeX 版本。我不会使用\vbox_set:Nn\hbox_set:Nn。并且您需要生成\exp_args:NNNe

最好在文档开始时进行设置,因为\normalfont在序言中实际上并不知道。

相关内容