2010-03-13 13 views
15

Si tratta di una semplice domanda a cui io non sono in grado di trovare la risposta:LaTeX: come trovare i pacchetti a cui appartiene un comando?

Dato un LaTeX comando, come faccio a sapere cosa pacchetto (s) a cui appartiene o proviene da?

Ad esempio, dato il comando di spaziatura orizzontale \qquad, da quale pacchetto proviene? Particolarmente fastidioso dal momento che funziona senza includere alcun pacchetto!

+1

'\ qquad' deriva da TeX (ovvero dal nucleo principale), quindi non è necessario alcun pacchetto speciale LaTeX per consentirne l'utilizzo. –

+0

Noram: Sono un po 'OCD così. Mi piace conoscere il pacchetto e la documentazione originali per qualsiasi comando che utilizzo. Faccio lo stesso con MSDN quando utilizzo le API Microsoft. –

risposta

14

Dato un comando LaTeX, come individuare i pacchetti di appartenenza o di provenienza?

Consulta i tuoi riferimenti:

  1. Se è nell'indice alla texbook, è ereditato da TeX, il motore che spinge LaTeX.
  2. Altrimenti, se si trova nell'indice del manuale di LaTeX, è probabilmente definito in latex.ltx o in uno dei file di classe standard, non in un pacchetto.
  3. In caso contrario, se si trova nell'indice su The LaTeX Companion, il numero di pagina indica probabilmente il pacchetto da cui proviene.
  4. In caso contrario, si potrebbe fare un po 'di fantasia sui risultati di find /usr/share/texmf -name '*.sty', ma essere preparati per un esercizio doloroso.
  5. Oppure, è possibile chiedere su http://stackoverflow.com. Ma poi qualche idiota risponderà chiedendo perché vuoi sapere ...
5

Per quanto ne so, non c'è una risposta generale valida a questo. Ma ci sono un certo numero di tecniche che potresti provare per ogni comando dato. Nel caso di \qquad, fa parte del TeX di base. Ricorda che puoi sempre utilizzare TeX in modalità interattiva:

$ 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.

Alcune macro sono aggiunti da LaTeX sulla parte superiore del TeX, come ad esempio \begin:

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

? x 
No pages of output.

mentre

$ 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.

Tutto il resto viene dai pacchetti. Se vuoi veramente sapere da quale pacchetto proviene una macro (diversa da google o grepping del tuo texmf tree), puoi controllare dopo che ogni pacchetto che hai caricato sia definito. Prova la definizione di questo prima di qualsiasi comando \usepackage:

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

Poi, quando si esegue latex sul file .tex, cercare una riga nell'output che dice includegraphics is defined in graphicx. Non è probabile, ma alcuni pacchetti subdoli potrebbero fare cose cattive con \usepackage quindi c'è una possibilità che questo potrebbe non funzionare.Un'altra alternativa sarebbe quella di definire semplicemente il comando che ti interessa prima di caricare qualsiasi pacchetto:

\newcommand\includegraphics{}

Poi si potrebbe ottenere un messaggio di errore quando il pacchetto che definisce il comando è carico. Questo è in realtà meno affidabile rispetto al precedente approccio, poiché molti pacchetti utilizzano \def e \let per definire i loro macro anziché \newcommand, ignorando il controllo "già definito". Puoi anche inserire un assegno manualmente tra ogni carico:

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

3

A causa della mancanza di reputazione, non posso commentare la risposta di Steve, che è stata molto utile per me, ma vorrei estenderlo un po '.

In primo luogo, nel suo secondo approccio (manipolando con usepackage) il caso in cui usepackage non ha argomenti opzionali non viene trattato. In secondo luogo, i pacchetti vengono spesso caricati da altri pacchetti tramite RequirePackage, il che rende difficile trovare il luogo effettivo di definizione di un comando. Quindi la mia raffinatezza della risposta di Steve è:

\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} 

Il pacchetto xargs è qui utilizzato per ottenere le opzioni inusuali di usepackage a destra (primo e terzo parametro sono opzionali).

Mettere questo direttamente dopo documentclass dovrebbe indicare dove è definito includegraphics.

Problemi correlati