Wiederverwendbare und leicht bearbeitbare Schlüsselwörter definieren

Wiederverwendbare und leicht bearbeitbare Schlüsselwörter definieren

Ich schreibe einen Aufsatz, bei dem ich noch nicht alle stilistischen Entscheidungen getroffen habe. Das heißt, ich habe noch nicht entschieden, welche langen Wörter ich abkürzen möchte und wie ich sie abkürzen möchte, ob der Autor des Aufsatzes ein „ich“, ein „wir“, ein „der Autor“ oder die „Autoren“ usw. ist. Was ich also tun möchte, ist, einige Schlüsselwörter zu definieren, die oft wiederverwendet werden.

Ich möchte oben in meinem Dokument etwas in der Art tun, \newcommand{\auth}{we}und immer wenn ich \auth{}in mein Dokument schreibe, sollte das Wort „wir“ erscheinen. Die Erfahreneren unter Ihnen werden feststellen, dass das, was ich hier beschreibe, tatsächlich das bewirkt, was ich möchte, also weiter zur eigentlichen Frage.

Was ich wirklich tun möchte, ist, ein Wort im englischen Wörterbuch mit einem Befehl zu verknüpfen und beim Übergeben eines Arguments an diesen Befehl dessen Ausgabe leicht ändern zu können. Wenn ich also beispielsweise definiere, \auth{}dass „wir“ ausgegeben werden soll, möchte ich \auth{upper}stattdessen „Wir“ ausgeben. Ich möchte auch Possessivformen wie „Unsere“ und „unsere“ daraus erhalten können, indem ich \auth{upper, possessive}oder \auth{possessive}etwas Ähnliches aufrufe. Was wäre der beste Weg, dies zu erreichen? Kann ich eine Art Wörterbuch erstellen oder was empfehlen Sie?

Vielen Dank!

Antwort1

Nun, ich habe es versucht. Übrigens funktioniert es nur in LuaLaTeX:

%!TEX program = lualatex
\documentclass{article}
\usepackage{polyglossia}
\usepackage{luacode}
\begin{luacode*}
dofile(kpse.find_file("l-lpeg.lua"))
dofile(kpse.find_file("util-sto.lua"))
dofile(kpse.find_file("util-prs.lua"))
Pronouns = {
    ["formal"] = {
        ["possessive"] = "ours",
        ["nominative"] = "we",
        ["oblique"] = "us"
    },
    ["informal"] = {
        ["possessive"] = "mine",
        ["nominative"] = "I",
        ["oblique"] = "me"
    }
}
function Auth(keywords)
    local dummy = utilities.parsers.settings_to_array(keywords)
    for i,v in ipairs(dummy) do
        if Pronouns[dummy[i]] ~= nil then result = Pronouns[dummy[i]] end
    end
    for i,v in ipairs(dummy) do
        if result[dummy[i]] ~= nil then result = result[dummy[i]] end
    end
    return result
end
function Upper(string)
    return unicode.utf8.upper(unicode.utf8.sub(string,1,1))..unicode.utf8.sub(string,2,utf8.len(string))
end
\end{luacode*}
\def\auth#1{\directlua{tex.print(Auth("#1"))}}
\def\Auth#1{\directlua{tex.print(Upper(Auth("#1")))}}
\begin{document}
\auth{oblique,informal} \Auth{formal,possessive}
\end{document}

Antwort2

Dies war überraschend komplex, aber hier ist eine Lösung, die mit jedem TeX funktioniert*

\begingroup
\catcode`!=11 % for private macros
\endlinechar=-1
\catcode`\^^M=12 \catcode`\^^?=12\relax
\gdef\!stop{^^?}
\gdef\!fi{\fi}
\newtoks\!before \newtoks\!after

% some convenient shorthands
\gdef\!csnm#1{\csname#1\endcsname} 
\gdef\!ecsnm#1#2{\expandafter#1\csname#2\endcsname}

% the main command sets up the catcodes for reading in
% the definitions of the second argument
\gdef\newvarcommand#1{
  \begingroup\catcode`\^^M=12 \catcode`\^^?=12\relax
  {\escapechar=-1 \xdef\!name{\string#1}}
  \!ecsnm\newtoks{toks:\!name}
  \gdef#1##1{
    {\escapechar=-1 \xdef\!name{\string#1}}
    \begingroup
    \!processnextkey##1,^^?,
    \!ecsnm\the{toks:\!name}
    \!result
    \endgroup
  }
  \!newvarcommand
}

% for each modifier in the argument, set the corresponding
% conditional true
\gdef\!processnextkey#1,{\def\arg{#1}
  \ifx\!stop\arg\else
    \ifx\empty\arg\def\!key{default}\else\def\!key{#1}\fi
    \!ecsnm\ifx{ifkey:\!name:\!key}\relax
      \errmessage{Unknown key \!key\space for command \!name}
    \else\!csnm{key:\!name:\!key true}\fi
  \expandafter\!processnextkey\fi
}

% here we read the argument line by line
\gdef\!newvarcommand#1{\!getnext#1^^M^^?^^M}
\gdef\!getnext#1^^M{\def\arg{#1} 
  \ifx\!stop\arg\endgroup\else
  \ifx\empty\arg\else\!parse#1^^M\fi
  \expandafter\!getnext\fi
}

% for each entry, new conditionals are created to test whether a
% modifier is present or not, and a token list containing the
% conditionals and the word to be printed is appended to the
% token list read by the command to be defined
\gdef\!parse#1:#2^^M{\!before={}\!after={}\def\arg{#1}
  \ifx\empty\arg
    {\globaldefs=1 \!ecsnm\newif{ifkey:\!name:default}}
    \!before=\expandafter{\csname ifkey:\!name:default\endcsname}
    \!after=\expandafter{\!fi}
  \else\!setupnextkey#1,^^?,\fi
  \edef\!addtoks{\!ecsnm\the{toks:\!name}
    \the\!before\def\noexpand\!result{#2}\the\!after}
  \global\!csnm{toks:\!name}=\expandafter{\!addtoks}
}

% creating \newifs for each modifier
\gdef\!setupnextkey#1,{\def\arg{#1}
  \ifx\!stop\arg\else
    {\globaldefs=1 \!ecsnm\newif{ifkey:\!name:#1}}
    \!before=\expandafter{\the\expandafter\expandafter
      \expandafter\!before\!csnm{ifkey:\!name:#1}}
    \!after=\expandafter{\the\expandafter\!after\!fi}
  \expandafter\!setupnextkey\fi
}
\endgroup

Sie können Ihr „Wörterbuch“ dann wie folgt definieren:

\newvarcommand\auth{
  :we
  upper:We
  possessive:ours
  upper,possessive:Ours
}

In jede Zeile schreibst du kommagetrennt die Wörter, die du als Argumente verwenden willst, und dann nach einem Doppelpunkt das Wort, das erscheinen soll. Der Standardwert kann mit oder angegeben :valwerden default:val.Wichtig:Die Einträge sollten in der Reihenfolge aufsteigender Anzahl von Spezifizierern erfolgen (d. h., Sie sollten zuerst alle Einträge haben, die aus einem Wort bestehen, dann die mit zwei durch Kommas getrennten Wörtern, dann die mit drei und so weiter), sonst erhalten Sie möglicherweise falsche Ergebnisse.

\auth{} \auth{default} % these two are the same, "we"
\auth{upper} % "We"
\auth{possessive} % "ours"
\auth{upper,possessive} \auth{possessive,upper} % both "Ours"
\auth{lower} % this gives an "Unknown key" error

Lassen Sie mich für die upper,possessive:OursZeile erklären, wie der Code funktioniert. Grundsätzlich werden beim Lesen der Zeile zunächst Bedingungen \ifkey:auth:upperund erstellt \ifkey:auth:possessive. Dann wird eine Tokenliste

\ifkey:auth:upper
  \ifkey:auth:possessive
    \def\!result{Ours}
  \fi
\fi

wird erstellt und an eine Tokenliste mit dem Namen angehängt \toks:auth. Wenn Sie verwenden \auth{upper,possessive}, werden die Argumente gelesen und die entsprechenden Bedingungen \ifkey:auth:upperund ifkey:auth:possessiveauf true gesetzt, die toks:authTokenliste wird entpackt und \!resultgedruckt.


*Es wird allerdings ein Nicht-Äußeres angenommen \newif, wie in LaTeX, für einfaches TeX wären jedoch einige Anpassungen erforderlich.

verwandte Informationen