силлогизм пакет новый счетчик

силлогизм пакет новый счетчик

С помощью \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, который в любом случае предоставляет счетчик.

Третий элемент — это 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}

введите описание изображения здесь

Связанный контент