2010-03-13 13 views
15

Es una cuestión muy sencilla que no soy capaz de encontrar la respuesta:LaTeX: ¿Cómo encontrar paquetes a los que pertenece un comando?

Dado un látex comando, ¿cómo puedo saber lo que paquete (s) al que pertenece o viene?

Por ejemplo, dado el comando de espaciado horizontal \qquad, ¿de qué paquete proviene? ¡Especialmente problemático ya que funciona sin incluir ningún paquete!

+1

'\ qquad' proviene de TeX (es decir, desde el núcleo mismo), por lo que no es necesario ningún paquete especial de LaTeX que le permita usarlo. –

+0

Noram: Soy un poco OCD así. Me gusta saber el paquete original y la documentación para cualquier comando que uso. Hago lo mismo con MSDN cuando uso las API de Microsoft. –

Respuesta

14

Dado un comando LaTeX, ¿cómo puedo averiguar a qué paquete (s) pertenece o de dónde viene?

Consulte sus referencias:

  1. Si está en el índice a la TeXbook, ha heredado de TeX, el motor que impulsa LaTeX.
  2. De lo contrario, si está en el índice del manual de LaTeX, probablemente se haya definido en latex.ltx o en uno de los archivos de clase estándar, no en un paquete.
  3. De lo contrario, si está en el índice de LaTeX Companion, el número de página probablemente le diga de qué paquete es.
  4. De lo contrario, podría hacer un desvanecimiento sofisticado de los resultados de find /usr/share/texmf -name '*.sty', pero prepárese para un ejercicio doloroso.
  5. O bien, puede preguntar en http://stackoverflow.com. Pero entonces, un idiota responderá preguntando por qué quieres saber ...
5

Por lo que sé, no hay una respuesta general muy buena para esto. Pero hay varias técnicas que puedes probar para cualquier comando dado. En el caso de \qquad, es parte de TeX básico. Recuerde que siempre puede usar TeX en modo interactivo:

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

Algunas macros se agregan de látex en la parte superior de TeX, tales como \begin:

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

? x 
No pages of output.

mientras que

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

Todo lo demás viene de paquetes. Si realmente quieres saber de qué paquete proviene una macro (que no sea google o grepping tu árbol texmf), puedes verificar después de cada paquete que cargues si está definido. Intenta definir esto antes de cualquier \usepackage comandos:

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

A continuación, cuando se ejecuta latex en su archivo de .tex, busque una línea en la salida que dice includegraphics is defined in graphicx. No es probable, pero algunos paquetes desviados pueden hacer cosas malas con \usepackage, por lo que existe la posibilidad de que esto no funcione.Otra alternativa sería simplemente definir el comando que le interesa antes de cargar los paquetes:

\newcommand\includegraphics{}

Entonces es posible que obtenga un mensaje de error cuando el paquete que define el comando es de carga. Esto es realmente menos confiable que el anterior, ya que muchos paquetes usan \def y \let para definir sus macros en lugar de \newcommand, sin pasar por la verificación "ya definida". También podría simplemente insertar un cheque a mano entre cada carga:

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

3

Debido a la falta de reputación no puedo comentar la respuesta de Steve, que fue muy útil para mí, pero me gustaría extenderla un poco.

En primer lugar, en su segundo enfoque (jugueteando con usepackage) no se trata el caso en el que usepackage tiene argumentos opcionales. En segundo lugar, los paquetes a menudo son cargados por otros paquetes a través de RequirePackage, lo que hace que sea difícil encontrar el lugar real de definición de un comando. Así que mi refinamiento de la respuesta de Steve es:

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

El paquete xargs se utiliza aquí para obtener las opciones inusuales de usepackage derecha (primer y tercer parámetro es opcional).

Poner esto directamente después de documentclass debería indicar dónde se define includegraphics.

Cuestiones relacionadas