我可以用\定义定义一个新命令,但如何覆盖现有命令?
我的用例是重写所有内容{\externalfigure[cow]}
以\placefigure[right]{My Caption}{\externalfigure[cow]}
使它们浮动。
答案1
(重新)定义命令
\define
覆盖现有命令:
\define\foo{Foo}
\define\foo{Bar}
\starttext
\foo %% Bar
\stoptext
这将向日志文件打印一条消息,指出该命令已定义,但正在重新定义。如果你这样做不是想要覆盖现有命令,可以使用\unique
:
\def\foo{Foo}
\unique\def\foo{Bar}
\starttext
\foo %% Foo
\stoptext
这也会将消息打印到日志文件,但保留旧的定义。
command '\foo' is already defined
您的用例
我不会修改 TeX 宏或尝试重新定义核心宏。使用编辑器的搜索替换功能或编写正则表达式来添加\placefigure
到\externalfigure
调用之前。
如果你真的想要一个肮脏的 TeX 黑客,这是我的镜头:
\let\externalfigureOrig\externalfigure
\def\externalfigure[#1]%%
{\placefigure[right]{}{\externalfigureOrig[#1]}}
答案2
下面的内容不是标题中问题的答案,但可能对你有帮助。我认为它利用了 pandoc 的属性,即直接传递与输入格式的语法不匹配的内容。
因为你的管道是这样的:
[ reStructuredText ] pandoc
[ or Markdown ] --------------> [ context ]
[ or ... ]
你可能对pandoc+预处理器解决方案在 Aditya 的博客上。
在那篇文章中,他描述了使用gpp
使用通用预处理器,将特定于输出格式的代码放入他的 Markdown 文档中;您还可以使用它将具有自定义“翻译”的自定义结构元素放入您的文档中。
(The plain Markdown output)
<#define rightpic|![#1](#2)>
(The output for HTML mode)
<#ifdef HTML>
<#define rightpic|<img alt="#1" href="#2" float="right" />>
<#endif>
(the output for TeX mode)
<#ifdef TEX>
<#define rightpic|\\placefigure[right]{#1}{\\externalfigure[#2]}>
<#endif>
I have here a picture of a cow. <#rightpic My caption|cow>
使用以下方式直接将其编译为上下文或 HTML
gpp -H -DTEX=1 mysource.md | pandoc -f markdown -t context -o myresult.tex
gpp -H -DHTML=1 mysource.md | pandoc -f markdown -t html -o myresult.html
祝你好运!