как заменить латексные макросы их определениями (используя латекс) - PullRequest
9 голосов
/ 02 октября 2009

Как я могу заменить все вхождения пользовательских латексных макросов их определениями?

Например, для данного файла

old.tex

\newcommand{\blah}[2]{#1 \to #2}
...
foo \blah{egg}{spam} bar
...

как автоматически сгенерировать приведенный ниже файл

new.tex

...
foo egg \to spam bar
...

Вместо того, чтобы переопределять латексную макро-логику с помощью perl, могу ли я использовать для этого сам латекс или движок tex?

Ответы [ 4 ]

8 голосов
/ 27 апреля 2010

вуаля http://www.ctan.org/tex-archive/support/de-macro

Это Питон, который:

[...] развернет макросы, определенные в (re) командах newcommand или (re) newenvironment, в документе или в файле пакета «private» документа.

1 голос
/ 07 октября 2009

Рассмотрите возможность использования механизма шаблонов, такого как Jinja2 с Python.

Возможно, вы захотите изменить синтаксис по умолчанию {%, {{и т. Д., Чтобы сделать его более совместимым с собственным 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.

Надеюсь, это поможет.

1 голос
/ 04 октября 2009

Никогда не видел, чтобы это было сделано, но 2 недоделанных идеи:

  1. Если причина, по которой вы хотите развернуть все эти встроенные макросы, заключается в отладке, то установка \tracingmacros=1 в вашем документе приведет к расширению всех ваших макросов, но результат переместится в файл журнала.

  2. В архиве CTAN имеется пакет , который можно использовать для встраивания расширений в определениях (но не в новой команде), но я не знал, можете ли вы взять посмотрите, насколько болезненным может быть изменение для выполнения встроенных расширений \ newcommand вместо \ def.

0 голосов
/ 12 декабря 2018

Я написал программу на C еще в 2007 году для расширения \ newcommand: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...