как заменить макросы latex их определениями (используя latex)
-
19-09-2019 - |
Вопрос
Как я могу заменить все вхождения пользовательских макросов latex их определениями?
Например, учитывая этот файл
старый.текс
\newcommand{\blah}[2]{#1 \to #2}
...
foo \blah{egg}{spam} bar
...
как сгенерировать приведенный ниже файл автоматическим способом
новый.текс
...
foo egg \to spam bar
...
Вместо того, чтобы переопределять логику макросов latex с помощью perl, могу ли я использовать latex или сам движок tex для этого?
Решение
Никогда не видел, чтобы это было реализовано, но есть 2 недоделанные идеи:
Если причина, по которой вы хотите расширить все эти макросы, — это отладка, то установка
\tracingmacros=1
в вашем документе будут развернуты все ваши макросы, но вывод будет сохранен в файле журнала.А КТАН архив предоставляет упаковка который вы можете использовать для встроенных расширений в определениях (но не newcommand), но я не знал, сможете ли вы взглянуть и понять, насколько болезненной может быть модификация для выполнения встроенных расширений ewcommand вместо \def.
Другие советы
ВУАЛЯhttp://www.ctan.org/tex-archive/support/de-macro
Это Python, который:
[...] будет расширять макросы, определенные в командах (re)newcommand или (re)newenvironment, внутри документа или в «частном» файле пакета документа.
Рассмотрите возможность использования механизма шаблонов, такого как Джинджа2 с Питоном.
Возможно, вы захотите изменить синтаксис по умолчанию: {%, {{ и т. д.чтобы сделать его более совместимым с собственным LaTeX.Например:
env = jinja2.Environment(
loader=jinja2.FileSystemLoader( JINJA_DIRS ),
comment_start_string='["', # don't conflict with e.g. {#1
comment_end_string = '"]',
block_start_string = '[%',
block_end_string = '%]',
variable_start_string = '[=',
variable_end_string = ']',
autoescape=True,
finalize=_jinja2_finalize_callback, # make a function that escapes TeX
)
template = env.get_template( self.template )
tex = template.render( content )
Помимо функций, передаваемых в среду шаблона, Jinja2 поддерживает макросы.Например, приведенный выше код должен работать так, как ожидалось:
[% macro blah(egg, spam) -%]
foo [=egg] \to [=spam] bar
[%- endmacro %]
[= blah("chicken","pork") ]
% substitutes with "foo chicken \to pork"
Я не уверен, каковы ваши цели, и это требует некоторой работы, но это вовсе не непреодолимая проблема, если вы знакомы с Python.
Надеюсь, это поможет.
Я написал программу на C еще в 2007 году для расширения ewcommand: http://www.gtoal.com/src/newcommand/ - Я предполагаю, что он не был проиндексирован на момент публикации этого вопроса.Упоминаю это сейчас для тех, кто все еще ищет подобную вещь и находит эту страницу.
Из кода...
// FOR DOCUMENTATION, SEE MY BLOG POST:
// http://techennui.blogspot.com/2007/11/quick-hack-17-in-series-of-42-inlining.html
// Expands LaTeX \newcommand macros to allow submission of documents
// to print services which do not allow user-defined macros.
// Valid input formats are:
// \newcommand{\whatever}{Replacement text}
// \newcommand{\whatever}[2]{Expand #1 and #2 but not \#1 or even $\#1$}
// - anything else ought to be passed through verbatim; if an insurmountable
// error is detected, the program exits with a non-0 return code.
// The purpose of this utility is similar to:
// http://winedt.org/Macros/LaTeX/uncommand.php
// which I wasn't aware of when I wrote it. Though I would like to see how
// well that program handles the test input file, to see if it does the
// right thing with some of the more complex definitions :-)
//
// See also http://texcatalogue.sarovar.org/entries/de-macro.html
// and http://www.mackichan.com/index.html?techtalk/685.htm~mainFrame