Wenn ich in einem Dokument diesen Fehler kriege:

! Undefined control sequence.
l.1 \befehl

dann weiß ich, dass ich entweder den Befehl falsch geschrieben habe, oder er gehört zu irgendeinem Paket, was ich nicht geladen habe (oder Klasse o.ä.). Er ist eben nicht definiert.

Was ist die beste Strategie, das Problem zu lösen? Außer es mit google zu versuchen, in der Hoffnung, nicht veraltete Informationen zu finden, falls es nicht gerade ungooglebar ist wie \+ oder \@bst@nd und nicht zu allgemein oder zu exotisch ist. Ich habe ja auch nicht immer Internet-Verbindung.

Gibt es lokale Such-Tools oder eine geschickte Vorgehensweise, den richtigen Befehl (unscharfe Suche bei Tippfehler?) oder das zugehörige Paket auf der Festplatte oder CTAN zu finden, wo er definiert ist?

gefragt 10 Jul '13, 21:08

Helmut's gravatar image

Helmut
489161722
Akzeptiert-Rate: 100%

bearbeitet 11 Jul '13, 09:26

cgnieder's gravatar image

cgnieder
22.1k253463


Für solche Zwecke habe ich mir ein kurzes Shell-Script texgrep gemacht, die Hälfte davon sind erklärende Kommentare:

#!/bin/bash
# texgrep - searches for a text pattern contained in files
#   located inside the texmf trees
# usage: texgrep pattern [extension]
# usage examples:
#   texgrep phantomsection sty
#   texgrep \\\\def\\\\phantomsection
# Stefan Kottwitz, 2008
if [ $# -eq 0 ]; then
  echo 1>&2 Usage: texgrep pattern [extension]
  exit 1
fi
for path in TEXMFMAIN TEXMFDIST TEXMFHOME
do
 find `kpsewhich --var-value=$path` -name "*$2" |xargs grep $1
done
exit 0

Damit kann man nach Befehlen suchen und kriegt die Fundstellen samt Codezeile angezeigt. Das beinhaltet Definitionen und Anwendungen, man findet also mehr als man sucht. Dennoch überschaut man damit schnell, wo ein Befehl definiert ist, und kann das betreffende Paket ggf. nachladen.

Unter Linux und Mac OS X läuft das Script natürlich, unter Windows kann man Cygwin verwenden oder ändert die Scriptsprache auf etwas Windows-Typisches, z.B. batch oder powershell.

Weiterhin ist texdef ein sehr nützliches Script, das bereits in TeX Live enthalten ist. Damit kann sich Befehlsdefinitionen anzeigen lassen. Man sollte dann aber schon wissen, wo man texdef suchen lässt.

Permanenter link

beantwortet 11 Jul '13, 10:33

stefan's gravatar image

stefan ♦♦
18.3k163148
Akzeptiert-Rate: 50%

Warum verwendest Du nicht einfach Option -R von grep, sondern gehst erst über find?

(11 Jul '13, 13:51) saputello

@saputello Ist schon länger her, dass ich das Script gemacht habe - evtl. unterstützte meine grep-Version -R nicht oder es passte nicht mit pipen der Ausgabe von kpsewhich zusammen oder mit file name matching, müsste ich mal neu probieren.

(13 Jul '13, 13:55) stefan ♦♦

Bei Windows kann man über Suchen auch nach Inhalten suchen. Den Dialog Suchen findet man bis Windows 7 im Startmenü und im Windows Explorer (nicht zu verwechseln mit dem Internet Explorer). Wenn die Dateien des TeX-Baums indiziert sind, ist die Suche recht schnell. Es ist außerdem sinnvoll, die Suche auf eben den TeX-Baum zu beschränken, damit sie nur relevante Treffer findet.

Bei Linux gibt es verschiedene Werkzeuge. Das einfachste Werkzeug ist grep, das in der gnu-Version mit Option -R auch rekursive in einem Dateibaum suchen kann. Darüber hinaus gibt es aber auch Suchen, die mit Indexdiensten arbeiten. Der bekannteste davon ist Nepomuk. Seine Bekanntheit rührt aber in erster Linie daher, dass in früheren Versionen, das zugehörige Index-Programm virtuosu gerne mehrere CPUs mit 100% Last belegt und so das gesamte System ausgebremst hat. Die Suche selbst ist auch hier meist in die Dateibrowser, beispielsweise das KDE-Programm Dolphin, integriert. Auch hier ist eine Beschränkung der Suche auf Teile des Dateisystems möglich und sinnvoll.

Ich selbst suche übrigens vorzugsweise im Anleitungszweig, statt im gesamten TEXMF-Baum, weil ich dabei eher auf die definierten Befehle stoße. Selbst, wenn ich dort auf die Verwendung eines Befehls stoße, finde ich im Umfeld der Stelle meist einen Hinweis auf das benötigte Paket.

Bei einfachen Paketen, die nur wenige Befehle bereitstellen, hilft manchmal auch die Suche auf CTAN, beispielsweise bei der Suche nach FloatBarrier. Früher konnte man dort auch die Anleitungen selbst durchsuchen, was seit der Überarbeitung der Oberfläche leider nicht mehr möglich ist.

Die (La)TeX-Befehlsliste bietet ebenfalls eine gute Möglichkeit, um zu einem Befehl die bereitstellenden Dateien und Pakete zu finden. Über ein Eingabefeld kann man dort nach dem TeX-Live-Paket und den Dateien suchen, in denen ein (La)TeX-Befehl definiert ist. Erfasst sind Anwenderanweisungen, aber keine internen Befehle oder TeX-Primitive. Dabei werden alle Anweisungen, deren Name nur aus Buchstaben besteht, als Anwenderanweisungen betrachtet. Die Liste enthält derzeit allerdings keine Befehlen, die mit Hilfe von xparse definiert wurden. Ebenso scheinen nicht alle \if… enthalten zu sein. Darüber hinaus beschränkt sie sich auf Pakete, die in TeX Live enthalten sind.

Es gibt aber auch ein perl-Script zum Herunterladen. Damit kann man sich unter Linux mit einer vollständigen TeX-Live-Installation einschließlich tlmgr eine eigene Befehlsdatenbank anlegen, eine HTML-Übersichtseite erstellen und in der erzeugten Datenbank nach Befehlen suchen. Das Script können erfahrende perl-Hacker nach eigenem Belieben erweitern.

In der Regel sollte sich das Problem aber für Anwender gar nicht stellen, denn in der Regel sollten sie beim Schreiben problemorientiert zunächst ein für das Problem passendes Paket suchen und in der zugehörigen Anleitung dann die benötigten Befehle finden. Bei Lösungen im Internet, die nur die Befehle aber nicht die zugehörigen Pakete nennen, sollte man von vornherein vorsichtig sein.

Das Problem stellt sich also eher den Experten, die von Hilfesuchenden mit nicht funktionierenden Code-Schnippseln konfrontiert werden. Hier ist die einfache Lösung, den Fragesteller nach einem VM zu fragen.

Permanenter link

beantwortet 11 Jul '13, 07:14

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 16 Jul '13, 01:35

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×128
×52

gestellte Frage: 10 Jul '13, 21:08

Frage wurde gesehen: 38,574 Mal

zuletzt geändert: 16 Jul '13, 01:35