![三段论包新计数器](https://linux22.com/image/328184/%E4%B8%89%E6%AE%B5%E8%AE%BA%E5%8C%85%E6%96%B0%E8%AE%A1%E6%95%B0%E5%99%A8.png)
使用\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}