关于 \xpatchcmd、l3keys2e 包中的 \ProcessKeysOptions、kvoptions 包中的 \ProcessKeysOptions 和 \widowpenalties 的问题

关于 \xpatchcmd、l3keys2e 包中的 \ProcessKeysOptions、kvoptions 包中的 \ProcessKeysOptions 和 \widowpenalties 的问题

我使用 nowidow 包和 \setnowidow,但在某些情况下它工作不正常: 在此处输入图片描述

比如我希望段落可以在红色位置分页,但是却不行。

然后我测试,如果我改变nowidow.sty,使其\widowpenalties 2 10000 0成为\widowpenalties 3 10000 -1 0,它可以正常工作。

\newcommand{\setnowidow}[1][\nowidow@defaultlines]{%
    \mathchardef\nowidowmax#1\relax
    % \widowpenalties #1 \nowidow@X{1} 0\par <-- before it's
    \widowpenalties \numexpr(#1)+1 \nowidow@X{1} -1 0\par % <-- after i change
}

所以我尝试了很多方法来修补它(不直接更改 nowidow.sty),但都失败了。

方法1:我用\xpatchcmd,没有成功:

\xpatchcmd\setnowidow{\widowpenalties #1 \nowidow@X{1} 0\par}{\widowpenalties \numexpr(#1)+1 \nowidow@X{1} -1 0\par}{}{}

问题 1:为什么不能成功?


方法2:我尝试过\renewcommand,但也失败了:MWE:我的主要文本test.tex

\documentclass{book}

\usepackage[paper=a5]{zztj}

\begin{document}

abc

\end{document}

我的定制包裹zztj.sty

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

%---
\RequirePackage{nowidow}
\renewcommand{\setnowidow}[1][\nowidow@defaultlines]{%
    \mathchardef\nowidowmax#1\relax
    \widowpenalties \numexpr(#1)+1 \nowidow@X{1} -1 0\par
}

\setnowidow

% --------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}

构建错误:

! Missing number, treated as zero.
<to be read again> 
                   \tex_par:D 
l.15 \tl_new:N
              \g__zztj_paper_tl
? 

第二季度:为什么会出现这个错误?


方式3:所以我从中复制源代码nowidow.sty,并进行更改,但也无法成功,因为我l3keys2e也使用包:MWE:我的定制包zztj.sty

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

% --------start copy from nowidow--------
\RequirePackage{kvoptions}
\SetupKeyvalOptions{
   family=nowidow,
   prefix=nowidow@,
}
\DeclareStringOption[2]{defaultlines}
\DeclareBoolOption{all}
\ProcessKeyvalOptions*
\def\nowidow@X#1{%
    \ifnum#1<\nowidowmax
        10000
        \expandafter\nowidow@X\expandafter{%
           \the\numexpr(#1)+1\expandafter\relax\expandafter}%
    \fi
}
\newcommand{\setnowidow}[1][\nowidow@defaultlines]{%
    \mathchardef\nowidowmax#1\relax
    \widowpenalties \numexpr(#1)+1 \nowidow@X{1} -1 0\par
}
\ifnowidow@all
   \setnowidow
\fi
\newcommand{\nowidow}[1][\nowidow@defaultlines]{%
    \begingroup
    \setnowidow[#1]
    \endgroup
}
\newcommand{\setnoclub}[1][\nowidow@defaultlines]{%
    \mathchardef\nowidowmax#1\relax
    \clubpenalties \numexpr(#1)+1 \nowidow@X{1} -1 0\par
}
\ifnowidow@all
   \setnoclub
\fi
\newcommand{\noclub}[1][\nowidow@defaultlines]{%
    \begingroup
    \setnoclub[#1]
    \endgroup
}
% --------end copy from nowidow--------

\setnowidow

% --------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}

构建错误:

! Package keyval Error: paper undefined.

See the keyval package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.14 \ProcessKeyvalOptions*

第三季度:为什么会出现这个错误?


方式4:我\widowpenalties 3 10000 -1 0直接输入,还是不行:我的定制包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}

构建错误:

! Missing number, treated as zero.
<to be read again> 
                   \tex_global:D 
l.9 \tl_new:N\g__zztj_paper_tl

Q4:为什么\widowpenalties还是失败?


问5:修补\setnowidow命令但不直接更改的好方法是什么nowidow.sty

相关内容