Syllogismus-Paket neuer Zähler

Syllogismus-Paket neuer Zähler

Mit \syllogCaus dem Syllogismus-Paket schließt der Benutzer eine automatische Nummerierung für den Syllogismus ein.

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

wird ungefähr Folgendes ergeben:

(S1) Jeder Mensch ist sterblich. Sokrates ist ein Mensch. Sokrates ist sterblich.

Ich denke, dass Benutzer von einer automatischen Nummerierungsfunktion für jede Komponente des Syllogismus profitieren könnten:

(S1) A. Jeder Mensch ist sterblich. B. Sokrates ist ein Mensch. C. Sokrates ist sterblich.

Auf diese Weise können Benutzer nicht nur problemlos auf den gesamten Syllogismus, sondern auch auf jeden einzelnen Teil davon verweisen.

ZB: Wie in (S1) gezeigt, leitet sich aus der Prämisse (S1A) und der Prämisse (S1B) die Schlussfolgerung (S1C) ab.

Was ist der beste Code zum Implementieren dieser untergeordneten Zähler?

MWE:

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

Antwort1

Es ist nicht nötig, einen neuen Zähler zu verwenden (wäre vielleicht schwierig)

Ich habe einen anderen Ansatz verwendet und die Liste im \@syllocBefehl durch eine spezielle Liste ersetzt, sylloglistdie ein Klon von ist enumerateund den Zähler trotzdem bereitstellt.

Das dritte Element ist ein , das ich dort durch ruleersetzen muss . Die Listenabstandseinstellungen wurden in das optionale Argument von integriert .\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}

Bildbeschreibung hier eingeben

Antwort2

Der Ansatz des syllogismPakets ist nicht sehr überzeugend, mit einigen Patches bekommt man jedoch das, was man braucht.

Beachten Sie, dass die Bezeichnungen \labelfür den gesamten Syllogismus wie in den Beispielen dahinter stehen müssen, während die Bezeichnungen für die einzelnen Elemente darin stehen müssen.

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

Bildbeschreibung hier eingeben

Eine unabhängige Implementierung.

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

Bildbeschreibung hier eingeben

Eine Variante, die es erlaubt, zu lange Elemente im Syllogismus aufzuteilen. Ein neuer Schlüssel maxwidthwurde hinzugefügt (Standardwert \linewidth). Das Etikett bleibt am Rand der Elemente haften, wenn diese auf mehrere Zeilen aufgeteilt werden müssen (natürlich nur, wenn die Unternummerierung aktiviert ist).

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

Bildbeschreibung hier eingeben

verwandte Informationen