LaTeX: Как найти пакеты (ы), к которым принадлежит команда?

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

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

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

Ответы

Ответ 1

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

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

  • Если он в индексе к TeXbook, он унаследован от TeX, двигателя, который управляет LaTeX.
  • В противном случае, если он указатель в руководстве LaTeX, он, вероятно, определен в latex.ltx или в одном из стандартных файлов классов, а не в пакете.
  • В противном случае, если он в индексе для LaTeX Companion, номер страницы, вероятно, сообщает вам, из какого пакета он.
  • В противном случае вы можете сделать некоторые причудливые grepping по результатам find /usr/share/texmf -name '*.sty', но будьте готовы к болезненному упражнению.
  • Или вы можете задать /fooobar.com/.... Но тогда какой-то идиот ответит, спросив, почему вы хотите знать...

Ответ 2

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

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

Ответ 3

Насколько я знаю, на самом деле нет хорошего общего ответа. Но есть несколько методов, которые вы можете попробовать для любой команды. В случае \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 \[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.

Все остальное происходит из пакетов. Если вы действительно хотите узнать, из какого пакета приходит макрос (кроме Google или grepping вашего дерева 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

Ответ 4

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

Во-первых, в своем втором подходе (возиться с 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 справа (первый и третий параметры являются необязательными).

Поместите это непосредственно после documentclass, чтобы указать, где includegraphics определено.