С помощью \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}