Bestimmte Worte ersetzen

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


CallMeBW
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: So 20. Nov 2016, 19:15

Bestimmte Worte ersetzen

Beitrag von CallMeBW »

Hallo,

ich benötige ein Makro mit einem Argument und folgender Funktionsweise:
Das Argument wird überprüft. Falls es der Zahl "1" entspricht, wird "erste" zurückgegeben.
Falls es der Zahl "2" entspricht wird "zweite" zurückgegeben usw.
Ich benötige also eine Funktion, die aus Zahlen deutsche Zahlworte bildet. Mir reicht es, wenn die ersten 12 Zahlworte abgedeckt sind. Ist das Argument nicht eine Zahl zwischen 1 und 11, so soll einfach das Argument selbst zurückgegeben werden.

Beipsiel:
\zahlwort{1} % soll "erste" schreiben
\zahlwort{11} % soll "elfte" schreiben
\zahlwort{14} % soll "14" schreiben
.

Benutzeravatar
iTob
Forum-Meister
Forum-Meister
Beiträge: 1221
Registriert: Mo 19. Apr 2010, 22:19
Kontaktdaten:

Beitrag von iTob »

Da geht mit \ifcase, der beginnt allerdings bei Null, weshalb du vorher vom Argument eins abziehen musst. Ich hatte jetzt keine Lust auf dem Tablett alle Fälle einzutippen, aber das Prinzip sollte hier klar werden.
\documentclass[11pt]{article}

\newcounter{zahl}
\newcommand{\zahlwort}[1]{%
   \setcounter{zahl}{#1}%
   \addtocounter{zahl}{-1}%
   \ifcase\value{zahl}\relax
      eins%
   \or
      zwei%
   \or
      drei%
   \else
      #1%
   \fi
}

\begin{document}
\zahlwort{1}

\zahlwort{2}

\zahlwort{10}
\end{document}
Es findet allerdings keine Fehlerbehandlung statt für Fälle, in denen du keine Zahl als Argument übergibts …


Gute Nacht
Tobi
Ich biete Hilfe, Beratung und Schulung für alle Fragen rund um TeX, Buchgestaltung und Textsatz, sowie Grafik- und Kommunikationsdesign.
Mehr Infos und Kontakt unter tobiw.de.

Hier schreibe ich über TeX: Mein Blog „TeX-Beispiel des Monats“ (Deutsch) und TeX.tips (Englisch).

CallMeBW
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: So 20. Nov 2016, 19:15

Beitrag von CallMeBW »

Nabend Tobi,

vielen Dank für die schnelle und tolle Antwort. Wird gleich morgen früh umgesetzt ;)

Gast

Beitrag von Gast »

Statt die Zahl extra um eins zu vermindern, kann man den ersten Fall natürlich auch einfach leer lassen oder mit einer Fehlermeldung versehen oder "null" zurück geben oder ….
\newcommand{\zahlwort}[1]{%
   \ifcase #1\relax
     null% oder #1% oder Fehlermeldung
   \or
      eins%
   \or
      zwei%
   \or
      drei%
   \else
      #1%
   \fi
}

CallMeBW
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: So 20. Nov 2016, 19:15

Beitrag von CallMeBW »

Danke, das funktioniert schonmal klasse. Jetzt stehe ich allerdings vor der nächsten Schwierigkeit, die ich nicht bedacht hatte :D

Und zwar möchte ich gerne den Satz "Im zweiten Kapitel wird die Funktionsweise beschrieben" mit meiner neuen Funktion ersetzen:
Im \zahlwort{\ref{grundlagen}n Kapitel wird die Funktionsweise beschrieben
.
Das Problem ist, dass die Funktion eine Zahl erwartet, aber \ref{} gibt ein String zurück (Es könnte sich ja um Kapitel 2.2 handeln, dann ist das natürlich keine gültige Zahl).
ich möchte die Funktion aber tatsächlich nur mit chaptern verwenden, deren Referenz eine Zahl ist. In meinem Dokument liefert bspw.
\ref{grundlagen} %liefert "2" zurck
die Zahl zwei zurück.
Ich bräuchte also entweder eine Möglichkeit, de String in eine zahl umzuwandeln, oder ein ifcase-Konstrukt, das mit String umgeht :D

Wie könnte man das lösen?

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4267
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Du kannst mit zref die Zählerstände der counter abspeichern und dann abfragen.

CallMeBW
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: So 20. Nov 2016, 19:15

Beitrag von CallMeBW »

kann ich zref dann auch mit einem label verwenden? Denn ich möchte ja nicht nur über das aktuelle Kapitel schreiben, sondern bspw. in Kapitel 1 auf das zweite Kapitel verweisen?!
Wäre nett wenn du mir zeigen könntest wie man das mit zref umsetzt.

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4267
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Wäre nett wenn du mir zeigen könntest wie man das mit zref umsetzt.
Es wäre nett, wenn du etwas Eigeninitiative zeigen würdest und nicht alle Arbeit auf die anderen abschiebst.

zref hat eine Dokumentation und ein Minimalbeispiel hast du auch nicht geliefert.

https://tex.stackexchange.com/search?q=zref+chapter[/code]

CallMeBW
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: So 20. Nov 2016, 19:15

Beitrag von CallMeBW »

Nun habe ich mal ein Minimalbeispiel aufgesetzt.
Anhand des Codes sieht man, wie schön bereits die Funktion für das zuordnen von Zahlworten funktioniert. Mir ist allerdings nicht klargeworden, wie ich zref verwenden kann. ein Benutzer schlägt vor,
\zref@newprop{chapter}{\thechapter}
zu verwenden. Das hat aber nicht geklappt.

Ich hoffe, mir kann jemand helfen, das Problem vollends fertig zu lösen. Schließlich habe ich die Frage ja gestellt, weil ich es selbst nicht hinbekommen habe. Das Minimalbeispiel kann dafür gerne als Voraussetzung genommen werden :)
\documentclass[11pt]{scrreprt}
\usepackage[user]{zref}


\newcommand{\zahlwort}[1]{%
   \ifcase #1\relax
     #1.%
   \or
      erste%
   \or
      zweite%
   \or
      dritte%
  \or
      vierte%
  \or
      fünfte%
  \or
      sechste%
  \or
      siebte%
  \or
      achte%
  \or
      neunte%
  \or
      zehnte%
  \or
      elfte%
  \or
      zwölfte%
   \else
      #1.%
   \fi
}

\begin{document}
\zahlwort{0}\\
%\zahlwort{dasistkeineZahl}
\zahlwort{1}\\
\zahlwort{2}\\
\zahlwort{3}\\
\zahlwort{4}\\
\zahlwort{5}\\
\zahlwort{6}\\
\zahlwort{7}\\
\zahlwort{8}\\
\zahlwort{9}\\
\zahlwort{10}\\
\zahlwort{11}\\
\zahlwort{12}\\
\zahlwort{13}\\

\chapter{Kapitel Eins}
\label{chap:eins}
Das ist ein Text in Kapitel \ref{chap:eins}.

Folgendes funktioniert: Im \zahlwort{2}n Kapitel geht es um was anderes.

Folgendes hingegen nicht: %Im \zahlwort{\ref{chap:zwei}}n Kapitel geht es um was anderes.
\chapter{Kapitel Zwei}
\label{chap:zwei}
\end{document}
[/code]
Dateianhänge
Anbei der Output des Minimalbeispiels
Anbei der Output des Minimalbeispiels
output.png (9.85 KiB) 4287 mal betrachtet

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4267
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

\documentclass[11pt]{scrreprt}
\usepackage[user,counter]{zref}
\makeatletter
\zref@newprop{chapter}[1]{\the\c@chapter}
\zref@addprop{main}{chapter}
\newcommand\refchapterasnum[1]{\zref@extractdefault {#1} {chapter} {0}}
\makeatother


\newcommand{\zahlwort}[1]{%
   \ifcase #1\relax
     #1.%
   \or
      erste%
   \or
      zweite%
   \or
      dritte%
  \or
      vierte%
  \or
      fünfte%
  \or
      sechste%
  \or
      siebte%
  \or
      achte%
  \or
      neunte%
  \or
      zehnte%
  \or
      elfte%
  \or
      zwölfte%
   \else
      #1.%
   \fi
}

\begin{document}
\zahlwort{0}\\
%\zahlwort{dasistkeineZahl}
\zahlwort{1}\\
\zahlwort{2}\\
\zahlwort{3}\\
\zahlwort{4}\\
\zahlwort{5}\\
\zahlwort{6}\\
\zahlwort{7}\\
\zahlwort{8}\\
\zahlwort{9}\\
\zahlwort{10}\\
\zahlwort{11}\\
\zahlwort{12}\\
\zahlwort{13}\\

\chapter{Kapitel Eins}
\label{chap:eins}
Das ist ein Text in Kapitel \ref{chap:eins}.

Folgendes funktioniert: Im \zahlwort{2}n Kapitel geht es um was anderes.

Folgendes hingegen nicht: Im \zahlwort{\refchapterasnum{chap:zwei}}n Kapitel geht es um was anderes.
\chapter{Kapitel Zwei}
\label{chap:zwei}\zlabel{chap:zwei}
\end{document} 

Antworten