
При использовании renewcommand
иногда мне хочется сначала проверить, каков исходный код конкретной команды, например, какой chapter
был до того, как я ее изменил, чтобы быть уверенным, что я не внесу непреднамеренных изменений. Когда у меня загружено много пакетов, иногда просмотр исходного кода пакета для поиска ответа не так прост. Есть ли способ распечатать исходный код, используемый для определения конкретной команды?
решение1
Используйте
\meaning
,\show
чтобы получить значение макроса. (См. TeXbook или TeX по теме)Используйте
\the
,\showthe
чтобы получить значение регистров. (См. TeXbook или TeX по теме)Используйте
\tracingcommands
,\tracingmacros
(см. TeXbook или TeX по теме) иtrace
package, чтобы получить дополнительную информацию в файле журнала.Используйте команду eTeX
\ifdefined
(\ifcsname
см. руководство eTeX) или команду LaTeX\@ifundefined
(см.source2e
), или\ifx\foo\undefined
трюк, чтобы проверить, определен ли макрос.Используйте команду LaTeX
\CheckCommand
(описанную вclsguide
) для проверки определения макроса LaTeX.
решение2
Да, использование \show\mycommand
выведет определение макроса \mycommand
на консоль (ваш .log
файл).
Например, компиляция
\documentclass{book}
\begin{document}
test
\show\chapter
\end{document}
выходы
> \chapter=\long macro:
->\if@openright \cleardoublepage \else \clearpage \fi \thispagestyle {plain}\gl
obal \@topnum \z@ \@afterindentfalse \secdef \@chapter \@schapter .
на консоль. Обратите внимание, что выравнивание вывода не такое же, как при вводе кода. Таким образом, иногда проще увидеть точную структуру (если она правильно отступлена) при прямом просмотре исходного кода. Вот исходная запись изbook.cls
для \chapter
:
\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
\thispagestyle{plain}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
Также обратите внимание, что using \show
показывает только один уровень расширения для данного макроса. Используя вышеприведенный пример, нужно было бы выполнить (скажем) \show\@chapter
и \show\@schapter
(с соответствующей модификацией кода категории через пары \makeatletter
и \makeatother
), чтобы увидеть значение последующих вызовов в пределах \chapter
.
\meaning
может использоваться в аналогичном контексте.
ИзКнига TeX(стр. 10):
Вы можете отобразить значение управляющей последовательности во время работы TeX. Если вы введете
\show\cs
where\cs
is any control sequence, TeX ответит ее текущим значением. Например,\show\input
результат в> \input=\input.
, потому что\input
примитивен. С другой стороны,\show\thinspace
yields> \thinspace=macro: ->\kern .16667em .
Это означает, что
\thinspace
было определено как сокращение для\kern .16667em
. Набрав,\show\kern
вы можете убедиться, что\kern
это примитив. Результаты\show
появятся на вашем терминале и в.log
файле, который вы получите после запуска TeX.
решение3
Вы можете использоватьtexdef
для печати определений в терминале. Чтобы использовать его с определениями LaTeX, вам нужно либо вызвать его с опцией -t latex
, либо использовать соответствующий псевдоним latexdef
(если псевдоним определен в вашей системе).
Чтобы проверить определение, \chapter
вы можете выполнить texdef -t latex -c book chapter
. Причина, по которой вам нужно вызвать его с опцией, -c book
заключается в том, что то, что \chapter
вы, похоже, ищете, определено в этом классе. Чтобы также проверить, в каком файле находится определение, добавьте опцию -f
или -F
для полного пути. В моей системе texdef -t latex -c book -F chapter
возвращается
\chapter first defined in "/usr/local/texlive/2011/texmf-dist/tex/latex/base/book.cls".
\chapter:
\long macro:->\if@openright \cleardoublepage \else \clearpage \fi \thispagestyle {plain}\global \@topnum \z@ \@afterindentfalse \secdef \@chapter \@schapter
Если вы хотите увидеть доступные опции texdef
или узнать о нем больше, вы можете получить доступ к его документации с помощью texdoc texdef
.