三段論包新計數器

三段論包新計數器

使用\syllogC三段論包中的 ,使用者可以包含三段論的自動計數。

\syllogC{Every man is mortal} %
{Socrates is a man} %
{Socrates is mortal}

將產生接近於:

(S1) 每個人都會有一死。蘇格拉底是個男人。蘇格拉底終有一死。

我認為使用者可以從三段論的每個組成部分的自動計數功能中受益:

(S1) A. 每個人都會有一死。 B. 蘇格拉底是一個人。 C. 蘇格拉底是會死的。

這樣,使用者不僅可以輕鬆引用整個三段論,還可以輕鬆引用它的每個內部部分。

例如:如(S1)所示,由前提(S1A)和前提(S1B)得出結論(S1C)。

實現這些輔助計數器的最佳程式碼是什麼?

微量元素:

\documentclass[letterpaper,
          10pt,
          ]{article}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\usepackage{syllogism}

\begin{document}
\def\preA{All men except Socrates are able to laugh}
\def\preB{Socrates is a man}
\def\Conc{Socrates is not able to laugh}

\syllogC{\preA}{\preB}{\Conc}

\end{document} 

答案1

不需要使用新的計數器(也許會很困難)

我使用了另一種方法,將命令中的列表替換\@sylloc為特殊的列表sylloglist,該列表是enumerate,無論如何它都提供了計數器。

第三項是 a rule,我必須替換\item ...\item[]那裡。清單間距設定已合併至 的可選參數sylloglist

\documentclass[letterpaper, 10pt,]{article}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}

\usepackage{enumitem}
\usepackage{xpatch}
\usepackage{syllogism}

\newlist{sylloglist}{enumerate}{1}
\setlist[sylloglist,1]{label={\Alph*},ref={(S\csname thec:syl\endcsname\Alph*)}}
\makeatletter

\xpatchcmd{\@syllog}{%
  \begin{list}{}
    {%
      \setlength{\parsep}{\z@}
      \setlength{\itemsep}{\z@}
      \addtolength{\leftmargin}{-1.5em}
      \setlength{\itemindent}{-1ex}
      \setlength{\listparindent}{\itemindent}
    }
  }{%
    \begin{sylloglist}[parsep=\z@,itemsep=\z@,leftmargin={\dimexpr\leftmargin-1.5em},itemindent=-1ex,listparindent=\itemindent]
    }{\typeout{Patching startup of list succeeded}}{\typeout{Patching startup of list failed}}

\xpatchcmd{\@syllog}{%
  \item \rule{\SY@LenRule}{\SY@HiRule}
}{%
  \item[] \rule{\SY@LenRule}{\SY@HiRule}
  }{\typeout{Patching rule item of list succeeded}}{\typeout{Patching rule item of list failed}}
\xpatchcmd{\@syllog}{%
\end{list}
}{\end{sylloglist}}{\typeout{Patching end of list succeeded}}{\typeout{Patching end of list failed}}
\makeatother




\begin{document}
\def\preA{All men except Socrates are able to laugh\label{first}}
\def\preB{Socrates is a man\label{second}}
\def\Conc{Socrates is not able to laugh\label{conclusion}}

\syllogC{\preA}{\preB}{\Conc}


\def\preA{All men except Socrates are able to laugh\label{firstnew}}
\def\preB{Socrates is a man\label{secondnew}}
\def\Conc{Socrates is not able to laugh\label{conclusionnew}}

\syllogC{\preA}{\preB}{\Conc}


In \ref{conclusion} we found that ... whereas in \ref{conclusionnew} it was shown that ...

The statement \ref{first} is the same as \ref{firstnew}


\end{document}

在此輸入影像描述

答案2

包的做法syllogism不太有說服力;但是,透過一些補丁,您可以獲得所需的內容。

請注意,\label整個三段論必須放在它後面,就像範例中一樣,而單一項目的標籤必須放在其中。

\documentclass[letterpaper,
          10pt,
          ]{article}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\usepackage{syllogism}
\usepackage{etoolbox}

\makeatletter
\patchcmd{\@syllog}
  {\settowidth}
  {\setcounter{sylitem}{0}\settowidth}
  {}{}
\patchcmd{\@syllog}
  {\setlength{\SY@availSpace}}
  {\setcounter{sylitem}{0}\setlength{\SY@availSpace}}
  {}{}
\patchcmd{\syllogC}{\stepcounter}{\refstepcounter}{}{}
\setcounter{c:syl}{1}

\newcounter{sylitem}
\renewcommand{\thesylitem}{\Alph{sylitem}\closeparenref}
\renewcommand{\p@sylitem}{\openparenref S\arabic{c:syl}}
\newcommand{\syllogD}[3]{%
  \syllogC{\sylitem #1}{\sylitem #2}{\sylitem #3}%
}
\newcommand{\sylitem}{\refstepcounter{sylitem}\thesylitem.~}
\@namedef{thec:syl}{S\the\numexpr\arabic{c:syl}-1\relax\closeparenref}
\@namedef{p@c:syl}{\openparenref}
\protected\def\openparenref#1\closeparenref{\textup{(#1)}}
\protected\def\closeparenref{}
\makeatother

\begin{document}
\def\preA{All men except Socrates are able to laugh}
\def\preB{Socrates is a man}
\def\Conc{Socrates is not able to laugh}

\syllogD{\preA\label{syl1A}}{\preB\label{syl1B}}{\Conc\label{syl1C}}\label{syl1}

\syllogD{\preA\label{syl2A}}{\preB\label{syl2B}}{\Conc\label{syl2C}}\label{syl2}

\ref{syl1}--\ref{syl1A}--\ref{syl1B}--\ref{syl1C}

\ref{syl2}--\ref{syl2A}--\ref{syl2B}--\ref{syl2C}

\end{document}

在此輸入影像描述

獨立實施。

\documentclass{article}
\usepackage{booktabs,xparse,amssymb}

\ExplSyntaxOn

\keys_define:nn { syllogism }
 {
  number         .bool_set:N       = \l_syllogism_number_bool,
  number         .default:n        = true,
  label          .tl_set:N         = \l_syllogism_label_tl,
  subnumber      .bool_set:N       = \l_syllogism_subnumber_bool,
  subnumber      .default:n        = true,
  first-premiss  .tl_set:N         = \l_syllogism_first_tl,
  first-premiss  .value_required:n = true,
  second-premiss .tl_set:N         = \l_syllogism_second_tl,
  second-premiss .value_required:n = true,
  conclusion     .tl_set:N         = \l_syllogism_concl_tl,
  conclusion     .value_required:n = true,
 }

\NewDocumentCommand{\sylref}{m}{\textup{(\ref{#1})}}

\NewDocumentCommand{\syllogism}{m}
 {
  \setcounter{syllogismitem}{0}
  \group_begin:
  \keys_set:nn { syllogism } { #1 }
  \bool_if:NT \l_syllogism_number_bool
   {
    \refstepcounter{syllogism}
    \tl_if_blank:VF \l_syllogism_label_tl { \label { \l_syllogism_label_tl } }
    (\thesyllogism)\qquad
   }
  \begin{tabular}{@{}l}
  \bool_if:NT \l_syllogism_subnumber_bool
   {
    \refstepcounter{syllogismitem}
    \thesyllogismitem.~
   }
  \l_syllogism_first_tl
  \\
  \bool_if:NT \l_syllogism_subnumber_bool
   {
    \refstepcounter{syllogismitem}
    \thesyllogismitem.~
   }
  \l_syllogism_second_tl
  \\
  \midrule
  \bool_if:NT \l_syllogism_subnumber_bool
   {
    \refstepcounter{syllogismitem}
    \thesyllogismitem.~
   }
  \l_syllogism_concl_tl \qquad $\therefore$
  \end{tabular}
  \group_end:
 }
\ExplSyntaxOff

\NewDocumentCommand{\openparenref}{u\closeparenref}{\textup{(#1)}}
\NewDocumentCommand{\closeparenref}{}{}

\makeatletter
\newcounter{syllogism}
\renewcommand{\thesyllogism}{S\arabic{syllogism}\closeparenref}
\renewcommand{\p@syllogism}{\openparenref}
\newcounter{syllogismitem}
\renewcommand{\thesyllogismitem}{\Alph{syllogismitem}\closeparenref}
\renewcommand{\p@syllogismitem}{\openparenref S\arabic{syllogism}}
\makeatother


\begin{document}

\syllogism{
  number,
  label=syl1,
  subnumber,
  first-premiss={All men except Socrates are able to laugh\label{syl1A}},
  second-premiss={Socrates is a man\label{syl1B}},
  conclusion={Socrates is not able to laugh\label{syl1C}},
}

\bigskip

\syllogism{
  number,
  label=syl2,
  first-premiss={Mus syllaba est},
  second-premiss={Syllaba autem caseum non rodit},
  conclusion={Ergo mus caseum non rodit},
}

\bigskip

\syllogism{
  first-premiss={Mus syllaba est},
  second-premiss={Mus autem caseum rodit},
  conclusion={Ergo syllaba caseum rodit},
}

\bigskip

References:

\ref{syl1}--\ref{syl1A}--\ref{syl1B}--\ref{syl1C}

\ref{syl2}

\end{document}

在此輸入影像描述

允許打破三段論中過長項目的變體。maxwidth新增了新密鑰(預設值\linewidth)。如果必須跨行分割項目(當然,當啟動子編號時),標籤會貼在項目的邊緣。

\documentclass{article}
\usepackage{booktabs,xparse,amssymb,varwidth,showframe}

\ExplSyntaxOn

\keys_define:nn { syllogism }
 {
  number         .bool_set:N       = \l_syllogism_number_bool,
  number         .default:n        = true,
  label          .tl_set:N         = \l_syllogism_label_tl,
  subnumber      .bool_set:N       = \l_syllogism_subnumber_bool,
  subnumber      .default:n        = true,
  first-premiss  .tl_set:N         = \l_syllogism_first_tl,
  first-premiss  .value_required:n = true,
  second-premiss .tl_set:N         = \l_syllogism_second_tl,
  second-premiss .value_required:n = true,
  conclusion     .tl_set:N         = \l_syllogism_concl_tl,
  conclusion     .value_required:n = true,
  maxwidth       .dim_set:N        = \l_syllogism_maxwidth_dim
 }

\NewDocumentCommand{\syllogism}{m}
 {
  \setcounter{syllogismitem}{0}
  \group_begin:
  \keys_set:nn { syllogism } { maxwidth=\linewidth, #1 }
  \tl_put_right:Nn \l_syllogism_concl_tl { \unskip \nolinebreak\qquad $\therefore$ }
  \noindent
  \bool_if:NT \l_syllogism_number_bool
   {
    \refstepcounter{syllogism}
    \tl_if_blank:VF \l_syllogism_label_tl { \label { \l_syllogism_label_tl } }
    \makebox[3em][l]{(\thesyllogism)}
   }
  \begin{tabular}{@{}l}
  \syllogism_make_text:V \l_syllogism_first_tl
  \\
  \syllogism_make_text:V \l_syllogism_second_tl
  \\
  \midrule
  \syllogism_make_text:V \l_syllogism_concl_tl
  \end{tabular}
  \group_end:
 }

\cs_new_protected:Nn \syllogism_make_text:n
 {
  \begin{varwidth}
   {
    \dim_eval:n
     {
      \l_syllogism_maxwidth_dim
      \bool_if:NT \l_syllogism_number_bool { - 3em }
      - \tabcolsep
     }
   }
  \bool_if:NT \l_syllogism_subnumber_bool
   {
    \leftskip=1.5em
    \refstepcounter{syllogismitem}
    \makebox[0pt][r]{\makebox[1.5em][l]{\thesyllogismitem.}}
   }
  \ignorespaces
  #1
  \end{varwidth}
 }
\cs_generate_variant:Nn \syllogism_make_text:n { V }
\ExplSyntaxOff

\NewDocumentCommand{\openparenref}{u\closeparenref}{\textup{(#1)}}
\NewDocumentCommand{\closeparenref}{}{}

\makeatletter
\newcounter{syllogism}
\renewcommand{\thesyllogism}{S\arabic{syllogism}\closeparenref}
\renewcommand{\p@syllogism}{\openparenref}
\newcounter{syllogismitem}
\renewcommand{\thesyllogismitem}{\Alph{syllogismitem}\closeparenref}
\renewcommand{\p@syllogismitem}{\openparenref S\arabic{syllogism}}
\makeatother

\begin{document}

\syllogism{
  number,
  label=syl1,
  subnumber,
  first-premiss={All men except Socrates are able to laugh\label{syl1A}},
  second-premiss={Socrates is a man\label{syl1B}},
  conclusion={Socrates is not able to laugh\label{syl1C}},
}

\bigskip

\syllogism{
  number,
  label=syl2,
  first-premiss={Mus syllaba est},
  second-premiss={Syllaba autem caseum non rodit},
  conclusion={Ergo mus caseum non rodit},
}

\bigskip

\syllogism{
  first-premiss={Mus syllaba est},
  second-premiss={Mus autem caseum rodit},
  conclusion={Ergo syllaba caseum rodit},
}

\bigskip

\syllogism{
  number,
  label=syl3,
  subnumber,
  first-premiss={
    All men except Socrates are able to laugh
    All men except Socrates are able to laugh
    All men except Socrates are able to laugh
    All men except Socrates are able to laugh\label{syl3A}
  },
  second-premiss={Socrates is a man\label{syl3B}},
  conclusion={Socrates is not able to laugh\label{syl3C}},
}

\bigskip

References:

\ref{syl1}--\ref{syl1A}--\ref{syl1B}--\ref{syl1C}

\ref{syl2}

\end{document}

在此輸入影像描述

相關內容