为什么不能将 \widowpenalties 放在序言中?

为什么不能将 \widowpenalties 放在序言中?

打包文件zztj.sty

\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
\ProvidesExplPackage{zztj}{}{}{}
\RequirePackage{l3keys2e}

% --------------------------------
\widowpenalties 3 10000 -1 0

% --------my other options--------
\tl_new:N\g__zztj_paper_tl
\keys_define:nn{zztj/option}
{
  paper.choices:nn=
    {a4, a5}
    {\tl_gset:Nn\g__zztj_paper_tl{#1}},
}

\ProcessKeysOptions{zztj/option}

和测试文件test.tex

\documentclass{book}

\usepackage[paper=a5]{zztj}

\begin{document}

abc

\end{document}

产生此构建错误:

This is XeTeX, Version 3.141592653-2.6-0.999994 (TeX Live 2022) (preloaded format=xelatex)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2021-11-15> patch level 1
L3 programming layer <2022-02-24>
(d:/texlive/texmf-dist/tex/latex/base/book.cls
Document Class: book 2021/10/04 v1.4n Standard LaTeX document class
(d:/texlive/texmf-dist/tex/latex/base/bk10.clo)) (./zztj.sty
(d:/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
(d:/texlive/texmf-dist/tex/latex/l3backend/l3backend-xetex.def
(|extractbb --version)))
(d:/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty)
! Missing number, treated as zero.
<to be read again> 
                   \tex_global:D 
l.10 \tl_new:N\g__zztj_paper_tl
                               
? 

如果我想将其放入\widowpenalties 3 10000 -1 0我的包中,因为我想管理我的包中的所有设置,那么这个错误该如何解决?

答案1

当你声明时\ProvideExplPackage\ExplSyntaxOn是隐式有效的,所以空格会被忽略,你基本上是在说

\widowpenalties 310000 -10

它要求 TeX 查找 310000 个数字,但只找到一个。

要么使用“真实”空格,它在范围内\ExplSyntaxOn~波浪符号)

\widowpenalties 3 ~ 10000 ~ -1 ~ 0 \scan_stop:

或者延迟在包末尾设置之后\ExplSyntaxOff

\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
\ProvidesExplPackage{zztj}{}{}{}
\RequirePackage{l3keys2e}

% --------------------------------
% --------my other options--------
\tl_new:N\g__zztj_paper_tl
\keys_define:nn{zztj/option}
{
  paper.choices:nn=
    {a4, a5}
    {\tl_gset:Nn\g__zztj_paper_tl{#1}},
}

\ProcessKeysOptions{zztj/option}

% other expl3 code

\ExplSyntaxOff

\widowpenalties 3 10000 -1 0

不过,我不确定你想通过惩罚达到什么目的-1:这本质上与相同\widowpenalty 10000

添加“语法糖”可能会很有用,以便更容易输入而不必担心空格(我猜有一天会有一个官方expl3界面):

\cs_new_protected:Nn \redmoon_widowpenalties:n
 {
  \widowpenalties \clist_count:n { #1 } ~ \clist_use:nn { #1 } { ~ } \scan_stop:
 }

\redmoon_widowpenalties:n { 10000, -1, 0 }

相关内容