三段論法パッケージの を使用すると\syllogC
、ユーザーは三段論法の自動番号付けを組み込むことができます。
\syllogC{Every man is mortal} %
{Socrates is a man} %
{Socrates is mortal}
次のようなものが生成されます:
(S1) 人間は皆死ぬ。ソクラテスも人間である。ソクラテスは死ぬ。
三段論法の各要素の自動番号付け機能があれば、ユーザーは恩恵を受けることができると思います。
(S1) A. すべての人間は死ぬ。B. ソクラテスは人間である。C. ソクラテスは死ぬ。
この方法により、ユーザーは三段論法全体だけでなく、その内部の各部分も簡単に参照できるようになります。
例: (S1) に示すように、前提 (S1A) と前提 (S1B) から結論 (S1C) が導き出されます。
これらの補助カウンターを実装するのに最適なコードは何ですか?
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}
答え1
新しいカウンターを使用する必要はありません(おそらく難しいでしょう)
私は別のアプローチを使用して、コマンドのリストを のクローンである\@sylloc
特殊な に置き換えました。この特殊な は、とにかくカウンターを提供します。sylloglist
enumerate
3 番目の項目は なので、 をに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}