为什么 \Sentence 在段落中间使用时不返回 1?

为什么 \Sentence 在段落中间使用时不返回 1?

我正在写一份合同,想使用这个\Sentence命令。如果我在开始新段落后立即开始编号,这个命令会很有效,但当我试图在中间输入 1/a 时,它会失败。

\documentclass[parskip=half]{scrartcl}

\usepackage{scrjura}

\renewcommand*{\thesentence}{\alph{sentence}}
\renewcommand{\sentencenumberformat}{\thesentence)~}

\begin{document}
\begin{contract}
\Clause{title={Clause}}
\Sentence Test1
\Sentence Test2
\Sentence Test3

Test
\Sentence Why not a
Test
\Sentence Why not b

\end{contract}
\end{document}

让我

输出

但我希望在\Sentence第一次打电话时得到a)。

答案1

KOMA 类的文档不完整,有些地方不准确。在这种情况下,对 的介绍非常少\Sentence。显然支持“半自动”编号。据我所知,这意味着句子编号会在每个段落开始时重置并递增。代码区分了\Sentence在段落开头的 的使用,因此数字不会递增两次,但似乎没有明显的方法可以在不禁用段落自动编号的情况下防止自动递增。鉴于句子编号的目的是对句子进行编号,我想这并不完全不合理:只有在段落开头才有第一句话。一旦段落开始,数字必须为 2 或更大。

文档中推荐的使用小写字母编号的方法是使用支持定制环境的包enumerate或。enumitemenumerate

\documentclass[parskip=half]{scrartcl}
\usepackage{scrjura}
\renewcommand*{\thesentence}{\alph{sentence}}
\renewcommand*{\sentencenumberformat}{\thesentence)~}
\usepackage{enumitem}
\newlist{tbsclause}{enumerate*}{1}
\setlist[tbsclause]{label=\alph*)}
\begin{document}
\begin{contract}
  \Clause{title={Clause}}
  \begin{tbsclause}
    \item Test1
    \item Test2
    \item Test3
  \end{tbsclause}
  
  Test
  \begin{tbsclause}
    \item Why not a
    Test
    \item Why not b
  \end{tbsclause}
\end{contract}
\end{document}

句子编号从 1 开始

如果语法太难懂,我建议你\Clause使用简单的enumitem设置来制作你自己的版本。这是明智、合理和安全的方法。


如果您喜欢冒险,认为理智被高估,并且不介意您的文件在不方便的时候因为神秘的原因而变得混乱,并且想要坚持这种\Sentence方法,请注意以下几点。

  1. 如果软件包更新的话,下面的 hack 很可能会被破坏。我尝试过改变一些不太实质性的定义或修补这个定义,但都失败了。也许对这些东西有更好理解的人(这并不难)会做得更好。
  2. 这是一种蛮力和无知的方法,很可能会导致其他问题。您需要用鹰眼仔细审查结果。

买者自负!!


再次,如果你必须这样做,非常脏解决方法是在加载后将以下内容添加到您的序言中scrjura

\makeatletter
\renewcommand*{\contract@everypar}{%
  \ifparnumber
    \ifx\scrjura@special@par\relax
      \ifx\scrjura@special@reset@par\relax\else
        \global\let\thepar\scrjura@special@reset@par
        \global\let\scrjura@special@reset@par\relax
      \fi
      \refstepcounter{par}%
%       \refstepcounter{sentence}% 
    \else
      \ifx\scrjura@special@reset@par\relax
        \global\let\scrjura@special@reset@par\thepar
      \fi
      \global\let\thepar\scrjura@special@par
      \global\let\scrjura@special@par\relax
      \setcounter{sentence}{0}\refstepcounter{sentence}%
    \fi
    \begingroup
      \if@filesw
        \protected@write\@auxout{%
          \expandafter\let\csname \scrjura@env@type @Clauseformat\endcsname
          \@firstofone
        }{%
          \string\newmaxpar{\scrjura@env@type}%
                           {\csname the\scrjura@env@type
                             AbsoluteClause\endcsname}%
                           {\thepar}%
        }%
      \fi
      \getmaxpar\@tempa{\scrjura@env@type}%
                       {\csname the\scrjura@env@type AbsoluteClause\endcsname}%
      \typeout{Stored max is \@tempa}%
      \def\reserved@a##1\@nnil{\def\@tempa{##1}}%
      \afterassignment\reserved@a\@tempcnta=0\@tempa\relax\@nnil
      \ifnum \@tempcnta>\@ne
        {\usekomafont{parnumber}{\parformat\parformatseparation}}%
      \else
        \def\reserved@a{\relax}%
        \ifx\@tempa\reserved@a
          \withoutparnumber
        \else
          {\usekomafont{parnumber}{\parformat\parformatseparation}}%
        \fi
      \fi
    \endgroup
  \else
    \begingroup\withoutparnumber\endgroup
    \setcounter{sentence}{-1}\refstepcounter{sentence}%
  \fi
}
\makeatother

请注意,我不会在这里提供可编译的代码。如果你不知道如何使用上面的代码片段,你当然不应该尝试这样做。

从 1 开始编号

相关内容