diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/exp-testopt |
Initial commit
Diffstat (limited to 'macros/latex/contrib/exp-testopt')
-rw-r--r-- | macros/latex/contrib/exp-testopt/README | 392 | ||||
-rw-r--r-- | macros/latex/contrib/exp-testopt/exp-testopt.dtx | 459 | ||||
-rw-r--r-- | macros/latex/contrib/exp-testopt/exp-testopt.ins | 75 | ||||
-rw-r--r-- | macros/latex/contrib/exp-testopt/exp-testopt.pdf | bin | 0 -> 139231 bytes | |||
-rw-r--r-- | macros/latex/contrib/exp-testopt/exp-testopt.sty | 101 |
5 files changed, 1027 insertions, 0 deletions
diff --git a/macros/latex/contrib/exp-testopt/README b/macros/latex/contrib/exp-testopt/README new file mode 100644 index 0000000000..c9d7fcc303 --- /dev/null +++ b/macros/latex/contrib/exp-testopt/README @@ -0,0 +1,392 @@ +[en] + +LaTeX-package 'exp-testopt' - expandable variant of \@testopt + +Author: Paul Ebermann <Paul-Ebermann@gmx.de> +License: LPPL 1.3b or later, maintained + (see http://www.latex-project.org/lppl/). +Version: 0.3 + +All Documentation (other than this file) is in Esperanto. + +This package is meant for use by other packages. + +This package provides an expandable variant of the LaTeX +kernel command \@testopt, named \@expandable@testopt, and +a more general \@expandable@ifopt, both intended for package +writers. Also we have a variant of \newcommand which +uses these macros to check for optional arguments. + + +This Package needs no other packages for running. + +The typesetting of the documentation needs additionally +class scrartcl (KOMA-script), gmdoc-enhance (from me) +and gmdoc (from Grzegorz `Natror' Murzynowski), +gmdoc's dependencies, and some required LaTeX packages. + +The package comes as .dtx + .ins. +Run "tex exp-testopt.ins" to create the style file (and maybe put +it to texmf/tex/latex/paul/, if your docstrip is configured +accordingly), run (after that and maybe updating your TeX hash) +"latex exp-testopt.dtx" to create the documentation. +(Docstrip also creates an exp-testopt.test in the same directory, + which is to be used by the documentation.) + + Usage +------- + +There are two main commands for package writers: + + \@expandable@ifopt{<YES>}{<NO>} + \@expandable@testopt{<COMMAND>}{<DEFAULT>} + +Both of them try to check, wether following them is a optional +argument (this is, some stuff enclosed in []). In this case, +they expand to: + <YES> + <COMMAND> +In the other case, they expand to: + <NO> + <COMMAND>[<DEFAULT>] + +So, \@expandable@ifopt is a general branch command, while +\@expandable@testopt is meant as a replacement for \@testopt, +where <COMMAND> is "any sequence of commands that 'expects' to +be followed by [." (Quoted from ltdefns.dtx.) + +This replacement has the advantage of being expandable +(if <COMMAND> is so), but also has quite some limitations. + + +A third command is: + + \expnewcommand*{<COMMAND>}[<argnum>][<DEFAULT>]{<code>} + +This works like \newcommand, but when a command with an +optional argument is defined, it uses our expandable check +for the existence of the optional argument. (Without the default +argument it should work exactly the same.) + + Examples +---------- + + +The main usage is in definitions of commands, which are to +accept optional arguments. + + \expnewcommand*{\example}[1][Default]{% + \fbox{#1}% + } + +Thus \example outputs an box with "Default" in it, while +\example[Test] hat "Test" in it. + + +From another package (to be published soon): + + \expnewcommand*\monthName[2][\languagename]{% + \@format@month@name{#1}{\value{#2}}% + } + +This outputs the value of a given LaTeX counter as +a name of the like-numbered month, in the given +language, the default language being the current +babel language. (And here the expansibility is important, +since we don't want the value of the counter when +this is printed, but now, also when this ends up in +the table of contents.) + +When you want more control, you may use \@expandable@ifopt{<YES>}{<NO>}: + + \def\exampleOne{% + \@expandable@ifopt{% + \exampleOneOpt}{% + \exampleOneNoOpt}% + } + + \def\exampleOneOpt[#1]{#2}{ + % do something with #1 and #2 + } + \def\exampleOneNoOpt#1{% + % do some other thing with #1 + } + +With \@expandable@testopt{<COMMAND>}{<DEFAULT>} you may also +create commands which accept more than one optional argument. + + + Benefits +---------- + +The advantages of \expnewcommand and \@expandable@testopt to +\newcommand and \@testopt are in the expandibility of the created +commands - you can use them in moving arguments (like inside of +\protected@edef, \protected@write and so on), and the accessed variables +then have their current meanings (or the meaning at shipout time, for +write), not the meanings when the thing is finally typeset. + +\newcommand, on the other hand, creates protected commands - you can +use them also in moving arguments, but they are evaluated only at +typesetting time. + +What to use when depends heavily on the use case. + + + Limitations +------------- + +Since we want to be expandable, we really can't check the next +token, but only the next "macro argument". And comparing also +is not so easy when you can't assign something to a macro. + +So, we use as a workaround making a control sequence from the +next argument (trying to neutralize a bit things like control +sequences), and comparing them to a known control sequence. + +This has the following consequences: + +- we cant distinguish between [ and {[} - the second one + is also regarded as a "start of optional argument". + +- the next argument (when it is not simple '[') has to be of a + "friendly" kind - it should not contain braces, and any + "dangerous" token (anything not of category 10, 11, 12) + should come as the first token (only then it is neutralized). + (Often the next argument is only one token, then this is no + problem. Or it will be simple text, also no problem.) + + Otherwise, there will be strange errormessages. + +- multiple space tokens before the [ may irritate our + macros. + + +So, before using this macros, make sure the limitations don't +affect you. + + + +Have fun! + +------------- +[de] + +LaTeX-Paket 'exp-testopt' - Expandierbare Variante von \@testopt. + +Autor: Paul Ebermann (Paul-Ebermann@gmx.de). +Lizenz: LPPL 1.3b oder später, mit Maintenance-Status + "author-maintained". Siehe http://www.latex-project.org/lppl/. +Version 0.3 + +Geschrieben für eigenen Gebrauch +(d.h. für Nutzung in anderen LaTeX-Paketen von Paul Ebermann), aber +vielleicht ist es auch für andere von Nutzen. + +Die Dokumentation (außer dieser Datei) ist nur auf Esperanto. + + +Dieses Paket ist für Verwendung in anderen LaTeX-Paketen gedacht. +Es enthält eine expandierbare Variante des LaTeX-Kernel-Kommandos +\@testopt unter dem Namen \@expandable@testopt, eine +Verallgemeinerung davon als \@expandable@ifopt sowie eine Variante +von \newcommand, welche diese Makros nutzt, um die Existenz +optionaler Argumente festzustellen. + + +Das Paket kommt als .dtx + .ins. +Mit "latex exp-testopt.ins" wird die .sty-Datei erstellt (und +eventuell gleich nach texmf/tex/latex/paul/ installiert, +wenn docstrip entsprechend eingerichtet ist), mit +"latex exp-testopt.dtx" kann (danach und eventuell nach einer +Aktualisierung der TeX-Dateidatenbank) die Dokumentation neu +erstellt werden. +Docstrip erstellt auch eine Datei exp-testopt.test, welche nur +von der Dokumentation verwendet wird (vom Paket nicht verwendet). + + + Anwendung +---------- + +Die beiden Haupt-Kommandos für Package-Autoren: + + \@expandable@ifopt{<JA>}{<NEIN>} + \@expandable@testopt{<BEFEHL>}{<DEFAULT>} + +Beide versuchen herauszufinden, ob nach ihnen ein optionales +Argument folgt (das ist irgend etwas, was in [...] eingeschlossen +ist). In diesem Fall expandieren diese Makros zu: + + <JA> + <BEFEHL> + +Im anderen Fall expandieren sie zu: + + <NEIN> + <BEFEHL>[<DEFAULT>] + +\@expandable@ifopt ist also ein genereller Verzweigungsbefehl, +während \@expandable@testopt (welches dem Paket den Namen gab) +ein Ersatz für \@testopt aus dem LaTeX-Kernes ist: hier sollte +<BEFEHL> eine beliebige Sequenz von Kommandos sein, welche es +'erwartet', von [ gefolgt zu werden. (Frei übersetzt aus +ltdefns.dtx.) Damit kann man Makros mit optionalen Argumenten +und Defaultwerten für diese bauen. + +Dieser Ersatz hat den Vorteil, expandierbar zu sein (falls +<BEFEHL> dies ist), hat aber auch einige Beschränkungen (siehe +unten). + +Ein drittes Kommando ist: + + \expnewcommand*{<MAKRONAME>}[<argnum>][<DEFAULT>]{<Code>} + +Es funktioniert analog zu \newcommand, mit dem Unterschied, +dass (falls <DEFAULT> gegeben ist) die Überprüfung auf +optionale Argumente mit unserem \@expandable@testopt anstatt +mit \@testopt (bzw. seiner protected-Variante) geschieht. +(Ohne diesen Default-Wert sollten beide Definitionen exakt + identisch sein.) + + Beispiele +----------- + +Die Hauptverwendung wird die Definition von Kommandos mit +optionalen Argumenten sein: + + \expnewcommand*{\example}[1][Default]{% + \fbox{#1}% + } + +Hier gibt \example einen Kasten mit "Default" drin aus, wobei +\example[Test] ein "Test" im Kasten hat. + +Aus einem meiner anderen Packages (wird bald veröffentlicht) +sinngemäß: + + \expnewcommand*\monthName[2][\languagename]{% + \@format@month@name{#1}{\value{#2}}% + } + +Das gibt den Wert eines LaTeX-Zählers in der Form +eines Monatsnamens in der gewählten Sprache aus, wobei +der Default die aktuelle Babel-Sprache ist. +(Hierbei braucht man die Expansibilität wirklich, denn + wir wollen ja den aktuellen Wert des Zählers (und der + Sprache) haben, auch wenn das ganze nachher im + Inhaltsverzeichnis landet, wo eventuell andere Werte + aktuell sind.) + +Mehr Kontrolle bekommt man mit \@expandable@ifopt: + + + \def\exampleOne{% + \@expandable@ifopt{% + \exampleOneOpt}{% + \exampleOneNoOpt}% + } + + \def\exampleOneOpt[#1]#2{ + % mache etwas mit #1 und #2 + } + \def\exampleOneNoOpt#1{% + % mache etwas ganz anderes mit #1 + } + +Mit \@expandable@testopt kann man auch Kommandos basteln, +welche mehr als ein optionales Argument enthalten. + + + + Vorteile +--------- + +Die Vorteile von \expnewcommand sowie \@expandable@testopt +im Vergleich zu \newcommand und \@testopt aus dem Kernel liegen +in der Expandierbarkeit der erstellten Kommandos - man kann sie +innerhalb von bewegten Argumenten nutzen (wie \protexted@edef, +\@protected@write etc.) und die darin verwendeten Variablen +haben dann ihre aktuellen Werte, nicht die Werte, wenn der +Text endlich gesetzt wird. + +\newcommand (mit den optionalen Argumenten) erstellt "geschützte" +Kommandos - man kann sie in bewegten Argumenten verwenden, aber +sie werden erst dann ausgewertet, wenn sie gesetzt werden. + + +Welche der beiden Möglichkeiten besser ist, hängt stark von +der jeweiligen Situation ab. + + + Begrenzungen +-------------- + +Weil wir expandierbare Makros haben wollen, können wir nicht +wirklich (wie es \@testopt macht) das nächste Token überprüfen, +sondern nur das "nächste Makro-Argument". Der Vergleich ist +auch nicht einfach, wenn man keine Zuweisungen/Definitionen +machen darf. + +Als Workaround erstellen wir eine Kontrollsequenz aus dem +nächsten Argument (und versuchen dabei, es etwas unschädlich +zu machen), und vergleichen diese mit einer bekannten +Kontrollsequenz. + +Das hat die folgenden Konsequenzen: + +- Wir können nicht zwischen [ und {[} unterscheiden - auch + das zweite wird als "Anfang eines optionalen Argumentes" + interpretiert. + +- Das nächste Argument (wenn es denn nicht ein einfaches '[' + ist) muss sich friedlich verhalten - es sollte keine + {} enthalten, und andere gefährliche Token (alles, was nicht + Kategorie 10, 11, 12 hat) sollten nur an erster Stelle + auftauchen (da können sie unschädlich gemacht werden). + + (Wenn das nächste Argument nur aus einem Token besteht, + ist das kein Problem, auch nicht, wenn es einfach nur + Text ist.) + + Andernfalls kann es zu merkwürdigen Fehlermeldungen kommen. + +- Falls vor dem '[' mehrere Leerzeichen-Token kommen, kann + das unsere Makros verwirren. + + +Also, bitte vor dem Verwenden dieser Makros aufpassen, dass +die Beschränkungen nicht stören. + + +Viel Spaß! + +---------- +[eo] + +LaTeX-pakaĵo 'exp-testopt' - plibonigoj por gmdoc. +(Se vi ne scias, kio estas gmdoc, legu sube.) + +Aŭtoro: Paŭlo Ebermann (Paul-Ebermann@gmx.de). +Licenzo: LPPL 1.3, 'maintained' + (-> http://www.latex-project.org/lppl/). +Versio 0.3 + +Kreitaj por propra uzo, sed eble iom de ĝi ankaŭ +uzeblas por aliaj. + +La dokumentaro (escepte tiu ĉi dosiero) estas nur en la germana +lingvo. + +La pakaĵo ne bezonas ajnajn aliajn pakaĵojn. +Por la dokumentado bezonatas gmdoc, gmdoc-enhance +kaj scrartcl (KOMA-script). + + +La pakaĵo venas en .dtx + .ins. +Voku "latex exp-testopt.ins" por krei la .sty-dosieron (kaj +eble meti ĝin al texmf/tex/latex/paul/, se via docstrip estis +konfigurita laŭe), voku "latex exp-testopt.dtx" por rekrei +la dokumentaron. + +La dokumentaĵo estas en exp-testopt.pdf. + 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: diff --git a/macros/latex/contrib/exp-testopt/exp-testopt.ins b/macros/latex/contrib/exp-testopt/exp-testopt.ins new file mode 100644 index 0000000000..89e9f1d033 --- /dev/null +++ b/macros/latex/contrib/exp-testopt/exp-testopt.ins @@ -0,0 +1,75 @@ +%% +%% (C) 2002-2008 Paul Ebermann - Installationsdatei zu exp-testopt.dtx +%% +%% Der vollständige Urheberrechtshinweis befindet sich +%% am Begin von exp-testopt.dtx. +%% +%% Ich gebe keine Garantie irgendeiner Art. +%% + +\input docstrip.tex + +%% +%% La test-dosiero, uzata por la dokumentaĵo (sed nenie alie). +\generate{ + \file{exp-testopt.test}{\from{exp-testopt.dtx}{test}} +} + +\usedir{tex/latex/paul} + +\Msg{**********************************************************} +\Msg{* Ich werde Dateien in \showdirectory{tex/latex/paul} } +\Msg{* installieren. Bitte stellen Sie sicher, } +\Msg{* dass dieses Verzeichnis vorhanden ist. } +\Msg{* } + +%% der folgende Text wird in jeder generierten +%% Datei am Anfang eingefügt. +\preamble + + ,--------------------------------------------------. + | Das ist eine generierte Datei. | + | | + | (c) 2009 Paul Ebermann. | + '--------------------------------------------------' +\endpreamble + + + + +\generate{ + \file{exp-testopt.sty}{\from{exp-testopt.dtx}{package}} +} + + + +%\generate{\file{exp-testopt.cls}{\from{exp-testopt.dtx}{class}}} + +\Msg{#######################} +\Msg{# } +\Msg{# Um die Installation zu beenden, } +\Msg{# müssen Sie die folgenden Dateien } +\Msg{# in Ihrem TeX-Suchbaum unterbringen: } +\Msg{# } +\Msg{# exp-testopt.sty } +%\Msg{# exp-testopt.cls } +\Msg{# } +\Msg{# Um eine Dokumentation zu erzeugen, } +\Msg{# benutzen Sie } +\Msg{# } +\Msg{# latex exp-testopt.dtx } +\Msg{# } +\Msg{# Viel Spaß } +\Msg{# Paul Ebermann } +\Msg{# } +\Msg{#######################} + +\endbatchfile + + +%%% Folgendes ist nur für meinen Editor. +%%% +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/macros/latex/contrib/exp-testopt/exp-testopt.pdf b/macros/latex/contrib/exp-testopt/exp-testopt.pdf Binary files differnew file mode 100644 index 0000000000..411b0a28f9 --- /dev/null +++ b/macros/latex/contrib/exp-testopt/exp-testopt.pdf diff --git a/macros/latex/contrib/exp-testopt/exp-testopt.sty b/macros/latex/contrib/exp-testopt/exp-testopt.sty new file mode 100644 index 0000000000..9ab9750c8b --- /dev/null +++ b/macros/latex/contrib/exp-testopt/exp-testopt.sty @@ -0,0 +1,101 @@ +%% +%% This is file `exp-testopt.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% exp-testopt.dtx (with options: `package') +%% +%% ,--------------------------------------------------. +%% | Das ist eine generierte Datei. | +%% | | +%% | (c) 2009 Paul Ebermann. | +%% '--------------------------------------------------' +%% (C) 2008 Paul Ebermann +%% +%% Package exp-testopt - expandible testopt-Variante. +%% +%% Die Datei exp-testopt.dtx sowie die dazugeh^^c3^^b6rige +%% 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^^c3^^a4ter (nach Wahl des Verwenders). +%% +%% Der 'maintenance-status' ist (zur Zeit) 'author-maintained'. +%% +%% Das hei^^c3^^9ft u.a., die Dateien d^^c3^^bcrfen frei vertrieben werden, +%% bei ^^c3^^84nderungen (durch andere Personen als Paul Ebermann) +%% ist aber der Name der Datei zu ^^c3^^a4ndern. +\NeedsTeXFormat{LaTeX2e}[2005/12/01]% +\ProvidesPackage{exp-testopt}[2009/03/06 v0.3 (PE)] + +\newcommand*{\@expandable@testopt}[2]{% + \@expandable@ifopt{#1}{#1[#2]}% +} + +\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 + \exp@testopt@opt@% \dots kaj tiu anta^^c5^^addifinita makroo. + \afterfi{#1#3}% En la jes-kazo, vokas la unuan argumenton + \else% \dots en la ne-kazo la duan. + \@expandable@ifOneToken#3\@expandable@ifOneToken% Tiu + {\afterfi{#2#3}}% + {\afterfi{#2{#3}}}% + \fi% +}% + +\def\exp@testopt@opt@{<<<[>>>}% tio estas la nomo, kies valoron ni +\@namedef{exp-testopt@@\string[@}{<<<[>>>}% Tio -- '\exp-testopt@@[@' -- estas + +\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 +\@namedef{exp-testopt@@@}{<<<>>>}% Tio -- + +\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}% + }% +} + +\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]}% ^^c4^^88i + {\@argdef#1[#2]}% Tiu estas la originalo. +} + +\@ifundefined{afterfi}{% + \def\afterfi#1#2\fi{% + \fi#1% + }% +}{}% + +\endinput +%% +%% End of file `exp-testopt.sty'. |