LaTeX: Как найти пакет (ы), к которым принадлежит команда? - PullRequest
18 голосов
/ 14 марта 2010

Это простой вопрос, на который я не могу найти ответ:

Учитывая команду LaTeX , как мне узнать, к какому пакету (s) он принадлежит или откуда?

Например, с учетом команды \qquad горизонтальный интервал, из какого пакета она поступает? Особенно хлопотно, поскольку работает без упаковки!

Ответы [ 4 ]

14 голосов
/ 14 марта 2010

С учетом команды LaTeX, как мне узнать, к какому пакету (-ам) он принадлежит или откуда?

Обратитесь к своим ссылкам:

  1. Если он входит в индекс TeXbook, он наследуется от TeX, движка, который управляет LaTeX.
  2. В противном случае, если он находится в указателе к руководству по LaTeX, он, вероятно, определен в latex.ltx или в одном из стандартных файлов классов, а не в пакете.
  3. В противном случае, если он находится в индексе LaTeX Companion , номер страницы, вероятно, скажет вам, из какой он упаковки.
  4. В противном случае, вы могли бы сделать некоторую причудливую оценку результатов find /usr/share/texmf -name '*.sty', но будьте готовы к болезненному упражнению.
  5. Или вы могли бы спросить по http://stackoverflow.com. Но тогда какой-нибудь идиот ответит, спросив, почему вы хотите знать ...
10 голосов
/ 14 марта 2010

Вы можете выполнить поиск http://www.ctan.org/tex-archive/info/symbols/comprehensive/ для этой информации и др.

Помните, что LaTeX является языком макросов поверх TeX, и все макросы состоят из TeX, который не нужно импортировать. \qquad находится в этой категории.

5 голосов
/ 14 марта 2010

Насколько я знаю, нет действительно хорошего общего ответа на это. Но есть несколько методов, которые вы можете попробовать для любой команды. В случае \qquad это часть базового TeX. Помните, что вы всегда можете использовать TeX в интерактивном режиме:

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

Некоторые макросы добавляются LaTeX поверх TeX, например \begin:

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

? x
No pages of output.

тогда

$ 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 \reserved@a {\@latex@error {Environment #1 undefine
d}\@eha }}{\def \reserved@a {\def \@currenvir {#1}\edef \@currenvline {\on@line
 }\csname #1\endcsname }}\@ignorefalse \begingroup \@endpefalse \reserved@a .
 \show\begin

? x
No pages of output.

Все остальное приходит из пакетов. Если вы действительно хотите знать, из какого пакета поступил макрос (кроме как с помощью Google или поиска в дереве texmf), вы можете проверить, определен ли каждый загруженный пакет. Попробуйте определить это перед любой командой \usepackage:

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

Затем, когда вы запустите latex в вашем файле .tex, найдите строку в выводе, которая говорит includegraphics is defined in graphicx. Это маловероятно, но некоторые коварные пакеты могут делать плохие вещи с \usepackage, поэтому есть вероятность, что это может не сработать. Другой вариант - просто определить интересующую вас команду перед загрузкой любых пакетов:

\newcommand\includegraphics{}

Тогда может появиться сообщение об ошибке при загрузке пакета, определяющего команду. Это на самом деле менее надежно, чем предыдущий подход, поскольку многие пакеты используют \def и \let для определения своих макросов, а не \newcommand, минуя «уже определенную» проверку. Вы также можете просто вставить чек вручную между каждой нагрузкой:

\ifcsname includegraphics\endcsname\message{^^Jdefined after graphicx^^J}\fi
3 голосов
/ 20 ноября 2012

Из-за отсутствия репутации я не могу комментировать ответ Стива, который был очень полезен для меня, но я бы хотел немного его расширить.

Во-первых, в его втором подходе (игра с usepackage) случай, когда usepackage имеет необязательные аргументы, не рассматривается. Во-вторых, пакеты часто загружаются другими пакетами через RequirePackage, что затрудняет поиск фактического места определения команды. Поэтому мое уточнение ответа Стива:

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

Пакет xargs используется здесь для получения необычных опций usepackage right (первый и третий параметры являются необязательными).

Если поставить это сразу после documentclass, это скажет, где определено includegraphics.

...