2010-03-13 12 views
15

Jest to proste pytanie, na które nie jestem w stanie znaleźć odpowiedź:LaTeX: Jak znaleźć pakiet (y), do których należy polecenie?

Biorąc lateksem komenda, w jaki sposób mogę się dowiedzieć, co pakiet (y) należy do lub pochodzi z?

Na przykład, biorąc pod uwagę rozstawę poziomą \qquad, z której paczki pochodzi? Szczególnie kłopotliwy, ponieważ działa bez dołączania jakiejkolwiek paczki!

+1

'\ qquad' pochodzi z TeX (tj. Z samego rdzenia), więc nie ma potrzeby instalowania specjalnego pakietu LaTeX, aby można go było używać. –

+0

Noram: Jestem trochę podobny do OCD. Lubię znać oryginalny pakiet i dokumentację dla każdego polecenia, którego używam. Robię to samo z MSDN, gdy używam Microsoft API. –

Odpowiedz

14

Przy użyciu polecenia LaTeX, w jaki sposób mogę się dowiedzieć, do którego pakietu (ów) należy?

Consult referencje:

  1. Jeśli jest w indeksie do TeXbook, to odziedziczone Tex, silnik, który napędza lateksu.
  2. W przeciwnym razie, jeśli znajduje się w indeksie do podręcznika LaTeX, prawdopodobnie jest zdefiniowany w latex.ltx lub w jednym ze standardowych plików klas, a nie w pakiecie.
  3. W przeciwnym razie, jeśli znajduje się w indeksie do LaTeX Companion, numer strony prawdopodobnie mówi, z jakiego pakietu pochodzi.
  4. W przeciwnym razie możesz zrobić fantazyjne grepping na wynikach find /usr/share/texmf -name '*.sty', ale przygotuj się na bolesne ćwiczenie.
  5. Możesz też zapytać na http://stackoverflow.com. Ale wtedy jakiś idiota odpowie, pytając, dlaczego chcesz wiedzieć ...
5

O ile mi wiadomo, nie ma na to naprawdę ogólnej ogólnej odpowiedzi. Ale istnieje wiele technik, które możesz wypróbować dla każdego polecenia. W przypadku \qquad jest to część podstawowego TeX-a. Pamiętaj, że zawsze możesz skorzystać TeX w trybie interaktywnym:

$ tex '\show\qquad' 
This is TeX, Version 3.141592 (Web2C 7.5.6) 
> \qquad=macro: 
->\hskip 2em\relax . 
\show\qquad 

? x 
No pages of output.

Niektóre makra są dodawane przez LaTeX na szczycie TeX, takie jak \begin:

 $ tex '\show\begin' 
This is TeX, Version 3.141592 (Web2C 7.5.6) 
> \begin=undefined. 
\show\begin 

? x 
No pages of output.

natomiast

$ latex '\show\begin' 
This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6) 
%&-line parsing enabled. 
entering extended mode 
LaTeX2e 
Babel and hyphenation patterns for english, usenglishmax, dumylang, noh 
yphenation, greek, monogreek, ancientgreek, ibycus, pinyin, loaded. 
> \begin=macro: 
#1->\@ifundefined {#1}{\def \[email protected] {\@[email protected] {Environment #1 undefine 
d}\@eha }}{\def \[email protected] {\def \@currenvir {#1}\edef \@currenvline {\[email protected] 
}\csname #1\endcsname }}\@ignorefalse \begingroup \@endpefalse \[email protected] . 
\show\begin 

? x 
No pages of output.

Wszystko inne pochodzi z pakietów. Jeśli naprawdę chcesz wiedzieć, z którego paczki pochodzi makro (poza przez google lub grepping twojego drzewa texmf), możesz sprawdzić po każdym załadowanym pakiecie, czy jest on zdefiniowany. Spróbuj zdefiniowania tego wcześniej żadnej \usepackage poleceń:

\let\oldusepackage\usepackage 
\renewcommand\usepackage[1]{ 
    \oldusepackage{#1} 
    \ifcsname includegraphics\endcsname 
    \message{^^Jincludegraphics is defined in #1^^J} 
    \let\usepackage\oldusepackage 
    \fi}

Następnie po uruchomieniu latex na pliku .tex, poszukaj linii na wyjściu, który mówi includegraphics is defined in graphicx. To mało prawdopodobne, ale niektóre przebiegłe pakiety mogą robić złe rzeczy dzięki \usepackage, więc jest szansa, że ​​to może nie działać.Inną alternatywą byłoby po prostu zdefiniować polecenia jesteś zainteresowany przed załadowaniem jakichkolwiek pakietów:

\newcommand\includegraphics{}

Następnie można otrzymać komunikat o błędzie, gdy pakiet, który definiuje polecenie jest ładowanie. Jest to w rzeczywistości mniej niezawodne niż poprzednie podejście, ponieważ wiele pakietów używa \def i \let do zdefiniowania swoich makr zamiast \newcommand, pomijając "już zdefiniowaną" kontrolę. Możesz również po prostu wstawić czek ręcznie pomiędzy każdym ładunkiem:

\ifcsname includegraphics\endcsname\message{^^Jdefined after graphicx^^J}\fi

3

Z powodu braku reputacji nie mogę wypowiedzieć się na temat odpowiedzi Steve'a, co było dla mnie bardzo pomocne, ale chciałbym ją nieco rozszerzyć.

Po pierwsze, w jego drugim podejściu (błahostka z usepackage) przypadek, w którym usepackage ma opcjonalne argumenty, nie jest rozpatrywany. Po drugie, pakiety są często ładowane przez inne pakiety za pośrednictwem RequirePackage, co utrudnia znalezienie rzeczywistego miejsca definicji polecenia. Więc moje udoskonalenie odpowiedź Steve'a jest:

\usepackage{xargs} 
\let\oldusepackage\usepackage 
\let\oldRequirePackage\RequirePackage 
\renewcommandx{\usepackage}[3][1,3]{ 
    \oldusepackage[#1]{#2}[#3] 
    \ifcsname includegraphics\endcsname 
    \message{^^Jincludegraphics is defined in #2^^J} 
    \let\usepackage\oldusepackage 
    \let\RequirePackage\oldRequirePackage 
    \fi} 
\renewcommandx{\RequirePackage}[3][1,3]{ 
    \oldRequirePackage[#1]{#2}[#3] 
    \ifcsname includegraphics\endcsname 
    \message{^^Jincludegraphics is defined in #2^^J} 
    \let\usepackage\oldusepackage 
    \let\RequirePackage\oldRequirePackage 
    \fi} 

Pakiet xargs stosuje się tutaj, aby uzyskać niezwykłe opcje usepackage prawo (pierwszy i trzeci parametr są opcjonalne).

Umieszczenie tego bezpośrednio po documentclass powinno określić, gdzie zdefiniowano includegraphics.

Powiązane problemy