summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/exp-testopt/exp-testopt.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/exp-testopt/exp-testopt.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/exp-testopt/exp-testopt.dtx')
-rw-r--r--macros/latex/contrib/exp-testopt/exp-testopt.dtx459
1 files changed, 459 insertions, 0 deletions
diff --git a/macros/latex/contrib/exp-testopt/exp-testopt.dtx b/macros/latex/contrib/exp-testopt/exp-testopt.dtx
new file mode 100644
index 0000000000..6cefe7715a
--- /dev/null
+++ b/macros/latex/contrib/exp-testopt/exp-testopt.dtx
@@ -0,0 +1,459 @@
+% \iffalse meta-comment
+%
+%% (C) 2008 Paul Ebermann
+%%
+%% Package exp-testopt - expandible testopt-Variante.
+%%
+%% Die Datei exp-testopt.dtx sowie die dazugehörige
+%% exp-testopt.ins sowie die damit generierte
+%% exp-testopt.sty stehen unter der
+%% "LaTeX Project Public License" (LPPL, zu finden
+%% unter http://www.latex-project.org/lppl/, sowie
+%% auch in den meisten TeX-Distributionen in
+%% texmf/docs/latex/base/lppl*.txt), Version 1.3b oder
+%% später (nach Wahl des Verwenders).
+%%
+%% Der 'maintenance-status' ist (zur Zeit) 'author-maintained'.
+%%
+%% Das heißt u.a., die Dateien dürfen frei vertrieben werden,
+%% bei Änderungen (durch andere Personen als Paul Ebermann)
+%% ist aber der Name der Datei zu ändern.
+%
+% \fi
+%
+% \iffalse
+% ---------------------------------------------
+%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]%
+% ----------------------------________________-----------------
+%<package>\ProvidesPackage{exp-testopt}[2009/03/06 v0.3 (PE)]
+% ----------------------------________________-----------------
+% \fi
+%
+% \iffalse
+%<*driver>
+\PassOptionsToClass{draft}{scrartcl}
+\documentclass{scrartcl}
+%
+% Esperantajn tekstojn oni prefere entajpu per unikodaj literoj.
+\usepackage[utf8x]{inputenc}
+\usepackage[esperanto]{babel}
+
+\addto{\extrasesperanto}{%
+ \renewcommand*{\generalname}{\^Generale}%
+ \GlossaryPrologue{%
+ \section{\^San\^goj}%
+ }%
+ \GlossaryMin=3\baselineskip
+ \IndexPrologue{%
+ \section{Indekso}
+ Kurzivaj nombroj indikas la lokojn, kie la indeks-ero estas priskribita,
+ substrekitaj nombroj indikas la lokon de la difino, la aliaj estas uzoj.
+ }
+ \IndexMin=5\baselineskip
+}
+
+
+\usepackage[svgnames]{xcolor}
+
+\usepackage{exp-testopt}
+
+\usepackage[bookmarks=false]{hyperref}
+\usepackage[countalllines, withmarginpar]{gmdoc}
+\usepackage[inline, visible]{gmdoc-enhance}
+\let\pack\textrm%
+\renewcommand*{\EOFMark}{}
+
+
+
+\newenvironment{kodo-citajho}[1][english]{%
+ \par
+ \addtolength{\CodeIndent}{1cm}
+ \addtolength{\TextIndent}{1cm}
+ \addtolength{\rightskip}{1cm}
+ \renewcommand*{\printlinenumber}{%
+ \leavevmode
+ \llap{\rlap{%
+ \hspace*{1cm}%
+ \LineNumFont$\phantom{999}$\llap{%
+ $(\thecodelinenum)$}}%
+ \hskip\leftskip%
+ %
+ }%
+ }
+%! \addmargin{5em}
+ \csname otherlanguage*\endcsname{#1}%
+ \slshape%
+ \expandafter\addtomacro\csname ttverbatim@hook\endcsname{\slshape}%
+ \MakeShortVerb\|\DeleteShortVerb\'%
+}{
+ \MakeShortVerb\'\DeleteShortVerb\|%
+ \csname endotherlanguage*\endcsname%
+ \endaddmargin
+}
+
+\addtomacro\LineNumFont{\normalcolor}
+
+
+\RecordChanges
+\begin{document}
+ % ^ ne taŭgas kiel specialsigno, ĉar ni
+ % bezonas ĝin por ^^B, ^^M ktp.
+ \catcode`\^=7%
+ \MakeShortVerb\'
+ \DocInput{exp-testopt.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \chschange{v0.1}{2009/03/03}{37}
+% \chschange{v0.2}{2009/03/03}{90}
+% \chschange{v0.3}{2009/03/06}{139}
+% \changes{v0.1}{2009/03/03}{Unua versio}
+% \changes{v0.2}{2009/03/03}{Preta por publikigo, mi kredas.}
+% \changes{v0.3}{2009/03/06}{Post pluraj cimkorektoj nun vere\
+% preta \dots}
+%
+% \GetFileInfo{exp-testopt.sty}
+%
+%
+% \title{La \pack{exp-testopt}-Pakaĵo -- ekspandebla varianto de \
+% \cs{@testopt}. \thanks{ Tiu dokumento rilatas al \
+% \pack{exp-testopt}~\fileversion, de~\filedate.}}
+% \author{Paul Ebermann\thanks{\texttt{Paul-Ebermann@gmx.de}}}
+%
+% \maketitle
+%
+%
+% \begin{abstract}
+% Ekspandebla varianto de '\@testopt' el la \LaTeX-kerno, kaj iom
+% pli ĝenerala (ankaŭ ekspandebla) '\@expandable@ifopt', por rekoni
+% ekziston de opciaj argumentoj (sen tuj doni defaŭlton).
+% Ankaŭ '\newcommand'-varianto, kiu uzas tion.
+% \end{abstract}
+%
+%
+% \tableofcontents
+%
+% \section{Uzanta dokumentaĵo}
+%
+% Tiu ĉi pakaĵo enhavas unu makroon rekte uzebla de uzantoj, kvankam
+% ankaŭ ĝin verŝajne pli ofte uzos pakaĵo-kreantoj.
+% Krome ĝi enhavas du utilajn makroojn por pakaĵ-kreantoj
+% (ne por uzantoj).
+%
+% \subsection{Makrooj}
+%
+% \TextUsage{\expnewcommand}'*'\arg{nomo}\arg[paramnum]\
+% \arg[defaŭlto]\arg{kodo}
+% --
+% funkcias simile kiel '\newcommand': Kreas komandon kun \meta{num} parametroj
+% (ĝis 9), kaj se \meta{defaŭlto} estas donita, la unua parametro estos
+% opcia kun \meta{defaŭlto} kiel defaŭlta valoro.
+% Diferenco al '\newcommand' nur ekzistas, se \meta{defaŭlto} estas
+% donita -- tiam je voko de la makroo ni uzas ekspandeblan komparon
+% por ekscii, ĉu unua parametro estas donita. (Tio havas la avantaĝon
+% esti ekspandebla, sed la limigojn menciitajn sube.)
+%
+%
+% \TextUsage{\@expandable@testopt}\marg{ordono}\marg{defaŭlto}
+% --
+% vokas \meta{ordono}n kun '[]'-parametro -- se neniu plia estas donata de
+% la uzanto, ni uzas \meta{defaŭlto} anstataŭe.
+% Pli detale: kontrolas, ĉu la sekva signo
+% estas '['. Se jes, iĝas \meta{ordono}, alikaze iĝas
+% \meta{ordono}\arg[defaŭlto].
+% (Tio funkcias simile kiel '\@testopt' el la \LaTeX-kerno.)
+%
+% \TextUsage{\@expandable@ifopt}\marg{jes}\marg{ne} --
+% kontrolas, ĉu la sekva signo estas '['. Se jes, vokas \meta{jes}, alikaze
+% \meta{ne}.
+%
+% \subsection{Limigoj}
+%
+% Fakte tiuj makrooj ne kontrolas la sekvan simbolon (kio igus ĝin
+% ne-ekspandebla pro uzo de '\futurelet', kiel '\@testopt'),
+% sed la sekvan makroo-argumenton ('#3', fakte). Krome estas malfacile
+% kompari ion, se oni ne povas difini/ŝanĝi ion.
+%
+% Tio havas la sekvajn konsekvencojn:
+% \begin{itemize}
+% \item
+% Ne eblas distingi '[' de '{[}' per nia algoritmo -- ambaŭ estas traktataj
+% kiel \meta{Jes}.
+% \item
+% La sekva argumento estu de la amika speco: Ĝi estu (se ĝi ne estas
+% simple '[') ĉeno el maksimume unu \emph{danĝera} simbolo (kontrolsekvenco
+% aŭ el danĝera kategorio) kaj poste simpla teksto (el kategorioj 10, 11,
+% 12).
+%
+% Se ĝi konsistas el nur unu simbolo, tio ne estas problemo. Se ĝi
+% konsistas el simpla teksto, tio ankaŭ ne estas problemo.
+%
+% En aliaj kazoj povas aperi strangaj erarmesaĝoj.
+% \item Apero de pluraj spaco-simboloj antaŭ la '[' povas konfuzigi la
+% programon, tiam ankaŭ aperos strangaj erarmesaĝoj.
+% \end{itemize}
+%
+% Do, antaŭ la uzo de tiuj makrooj bone pripensu, ĉu la limigoj vin
+% ĝenas.
+%
+% (Krome eblas trompi nian algoritmon per kreado de pliaj makrooj en la
+% nomspaco de '\exp-testopt@@'\meta{io}'@'. Ne faru tion, krom se vi certas
+% pri la konsekvencoj.)
+%
+%
+% \section{Ekzemplo}
+%
+% Jen ekzemplo de la uzo por krei komandon '\beispiel' kun opcia
+% argumento.
+%
+% \changes{v0.3}{2009/03/05}{Testo ankaŭ por \cs{expnewcommand}}
+%
+%<*test>
+\makeatletter
+\errorcontextlines = 20
+
+\def\beispiel{%
+ \@expandable@testopt\beispielImpl{Default}%
+}
+\def\beispielImpl[#1]{%
+ \fbox{#1}%
+}
+\makeatother
+
+\expnewcommand*{\ekzemplo}[1][Defa\u ulto]{%
+ \textbf{(#1)}%
+}
+
+\expnewcommand*{\ekzemploDu}[2][defa\u ulto]{%
+ \ensuremath{\frac{\mbox{#1}}{\mbox{#2}}}%
+}
+
+ \beispiel{egal} \beispiel[bla]
+ \beispiel$ e=m c^2$ \beispiel[$ e=m c^2$]
+
+ \ekzemplo\ekzemplo[Bla]
+ \expandafter\ekzemplo\space[bla]
+ \expandafter\expandafter\expandafter\ekzemplo\expandafter\space\space[dua bla]
+ \ekzemplo
+ [nova linio]
+ \ekzemplo
+
+ [du novaj linioj]
+ \ekzemplo[blub]
+
+ \ekzemploDu{testo}
+ \ekzemploDu[bla]{testo}
+
+%</test>
+%
+% Kontraŭe al kreado de tia komando per '\newcommand', la komando estas
+% tute ekspandebla (nu, krom la enhavo de '\beispielImpl'), anstataŭ
+% robustigita per malfruigita ekspandado. Tiel ekzemple eblas uzi valorojn
+% de variabloj kun ilia aktuala valoro, ankaŭ se la komando mem estos poste
+% skribota en dosieron. (Hmm, iom komplika, ĉu?)
+%
+% La supra kodo donas jenan rezulton:
+%
+% \begin{center}\StraightEOL
+% \fbox{\
+% \begin{minipage}{0.8\linewidth} \
+% \normalInput{\jobname.test} \
+% \end{minipage}\
+% }
+% \end{center}
+%
+% \StopEventually{\PrintChanges\PrintIndex}
+%
+% \section{Implementado}
+%
+%
+%<*package>
+
+
+%
+% \subsection{Ĉefaj makrooj}
+%
+% Niaj du ĉefaj makrooj nun aspektas tiom similaj, ke ni povas implementi
+% 'testopt' per 'ifopt'.
+%
+\newcommand*{\@expandable@testopt}[2]{%
+ \@expandable@ifopt{#1}{#1[#2]}%
+}
+
+% '\@expandable@ifopt' nun faras la laboron.
+%
+\newcommand{\@expandable@ifopt}[3]{%
+ \expandafter\ifx% '\ifx' komparas la difinojn de du makrooj, nome \dots
+ \csname exp-testopt@@\string#3@\endcsname% \dots makronomo kreita el la
+% tria argumento (= la signo poste).
+ \exp@testopt@opt@% \dots kaj tiu antaŭdifinita makroo.
+ \afterfi{#1#3}% En la jes-kazo, vokas la unuan argumenton
+% (kun la tria), \dots
+ \else% \dots en la ne-kazo la duan.
+%
+% Sed tiam ni ankoraŭ devos eltrovi, ĉu la tria konsistis el unu aŭ pluraj
+% tokenoj, por meti '{...}' ĉirkaŭ ĝin en la dua kazo. (Se ĝi nur estas
+% unu tokeno, meti '{...}' povas esti malhelpa, se ĝi fakte ne estas argumento
+% al '#2', sed ekzemple io kiel '$', aŭ sekva makroo.)
+ \@expandable@ifOneToken#3\@expandable@ifOneToken% Tiu
+% ĉi makroo provas eltrovi tion.
+ {\afterfi{#2#3}}%
+ {\afterfi{#2{#3}}}%
+ \fi%
+}%
+
+
+% La ideo por tia ekspandebla kontrolo de la sekva »signo« estas, ke ni
+% kreas el la »signo« makroonomon, kaj komparas la signifon de ĝi kun
+% signifo de konata makroo.
+%
+% \subsection{Komparendaj makrooj}
+%
+% Por tio ni kreas iujn nomojn, kiuj estas supozeble ne uzata de iu alia,
+% kun signifoj, kiuj ankaŭ supozeble ne erare aperas.
+%
+\def\exp@testopt@opt@{<<<[>>>}% tio estas la nomo, kies valoron ni
+% komparas kun aliaj kandidatoj.
+\@namedef{exp-testopt@@\string[@}{<<<[>>>}% Tio -- '\exp-testopt@@[@' -- estas
+% la makroo, kiu estos trovota en la \emph{jes}-kazo.
+
+
+% Ni ankoraŭ devas eltrovi, ĉu la argumento estas
+% nur unu tokeno aŭ pluraj, por povi meti '{...}'
+% en la dua kazo. Ni uzas similan trukon por tio.
+\long\def\@expandable@ifOneToken#1#2\@expandable@ifOneToken#3#4{%
+ \expandafter\ifx%
+ \csname exp-testopt@@\string#2@\endcsname%
+ \exp@testopt@empty@%
+ \afterfi{#3}%
+ \else
+ \afterfi{#4}%
+ \fi
+}
+
+\def\exp@testopt@empty@{<<<>>>}% tio
+% estas la nomo, kies valoron ni komparas kun aliaj kandidatoj.
+\@namedef{exp-testopt@@@}{<<<>>>}% Tio --
+% '\exp-testopt@@@' -- estas la makroo, kiu estos trovota en la kazo,
+% ke '#2' estas malplena.
+
+
+
+% \subsection{Komando-difinoj}
+%
+% \changes{v0.2}{2009/03/03}{Aldono de \cs{expnewcommand}.}
+%
+% Ni volas krei varianton de '\newcommand', kiu uzas
+% nian ekspandeblan metodon por opciaj argumentoj, anstataŭ
+% la robustan.
+%
+% Jen la originalo el latex.ltx (ltdefns.dtx, por esti
+% preciza, CTAN-versio de 2006-05-21).
+% \begin{kodo-citajho}
+%<*latex2e>
+% Handle the second optional argument.
+\long\def\@xargdef#1[#2][#3]#4{%
+ \@ifdefinable#1{%
+% Define the actual command to be:\\
+% |\def\foo{\@protected@testopt\foo\\foo{default}}|\\
+% where |\\foo| is a csname generated from applying |\csname| and
+% |\string| to |\foo|, ie the actual name contains a backslash and
+% therefore can't clash easily with exisiting command names.
+% ``Default'' is the contents of the second optional argument of
+% |(re)newcommand|. {\color{red}
+ \expandafter\def\expandafter#1\expandafter{%
+ \expandafter
+ \@protected@testopt
+ \expandafter
+ #1%
+ \csname\string#1\endcsname
+ {#3}}%
+% } Now we define the internal macro ie |\\foo| which is supposed to
+% pick up all arguments (optional and mandatory).
+ \expandafter\@yargdef
+ \csname\string#1\endcsname
+ \tw@
+ {#2}%
+ {#4}}}
+%</latex2e>
+% \end{kodo-citajho}
+%
+% Kaj ni nun devas ŝanĝi la markitan parton
+% por anstataŭe uzi nian metodon. Tio signifas, ke \meta{nomo} nun
+% estas difinita kiel
+% {\color{Green}'\@expandable@testopt\'\meta{nomo}\marg{defaŭlto}},
+% anstataŭ
+% {\color{red}^^A
+% '\@protected@testopt'\meta{nomo}'\'\meta{nomo}\marg{defaŭlto}}.
+%
+% (Kompreneble ni ne redifinas '\@xargdef', sed difinas nian
+% propran varianton, por uzi anstataŭe -- ni ja ne volas ŝanĝi
+% la bazan funkcion de '\newcommand'.)
+\long\def\@exp@xargdef#1[#2][#3]#4{%
+ \@ifdefinable#1{% { \color{Green}
+ \expandafter\def\expandafter#1\expandafter{%
+ \expandafter%
+ \@expandable@testopt%
+ \csname\string#1\endcsname%
+ {#3}}% }
+ \expandafter\@yargdef%
+ \csname\string#1\endcsname%
+ \tw@%
+ {#2}%
+ {#4}%
+ }%
+}
+
+
+% Kaj nun kelkaj paralelaj difinoj al '\newcommand', '\new@command' kaj
+% '\@newcommand'.
+%
+% \changes{v0.3}{2009/03/03}{Cim-korekto: \cs{exp@new@command} renomita al \cs{expnew@command}}
+%
+% '\expnewcommand' estas la ĉefa komando.
+\def\expnewcommand{%
+ \@star@or@long\expnew@command%
+}
+\def\expnew@command#1{%
+ \@testopt{\exp@newcommand#1}0%
+}
+\def\exp@newcommand#1[#2]{%
+ \@ifnextchar [{\@exp@xargdef#1[#2]}% Ĉi
+% tie ni vokas nian varianton anstataŭ '\@xargdef'.
+% ^^A ]
+ {\@argdef#1[#2]}% Tiu estas la originalo.
+}
+
+%
+% \subsection{Helpaj makrooj}
+%
+% '\afterfi'\arg{kodo} -- saltas ĝis post la sekva '\fi', kaj
+% ekzekutas \meta{kodo}n tie.
+%
+% Kopiita el \pk{gmutils}.
+%
+\@ifundefined{afterfi}{%
+ \def\afterfi#1#2\fi{%
+ \fi#1%
+ }%
+}{}%
+
+%
+%
+%
+% Jam fino :-)
+\endinput
+%</package>
+% (Jes, vere fino.)
+%
+% \Finale
+%\endinput
+
+
+%%% Folgendes ist nur für meinen Editor.
+%%%
+%%% Local Variables:
+%%% mode: docTeX
+%%% TeX-master: t
+%%% End: