![关于 \xpatchcmd、l3keys2e 包中的 \ProcessKeysOptions、kvoptions 包中的 \ProcessKeysOptions 和 \widowpenalties 的问题](https://linux22.com/image/461455/%E5%85%B3%E4%BA%8E%20%5Cxpatchcmd%E3%80%81l3keys2e%20%E5%8C%85%E4%B8%AD%E7%9A%84%20%5CProcessKeysOptions%E3%80%81kvoptions%20%E5%8C%85%E4%B8%AD%E7%9A%84%20%5CProcessKeysOptions%20%E5%92%8C%20%5Cwidowpenalties%20%E7%9A%84%E9%97%AE%E9%A2%98.png)
我使用 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
?