2

总 Emacs 菜鸟在这里。所以现在我正在 Emacs 中处理一个相当大的 LaTeX 项目,其中有几个地方我需要使用 makeidx 包来索引一些单词。因为我还希望索引词是粗体的,所以我创建了自己的命令\ind{}来使参数变为粗体并被索引。但现在我对这个命令不满意,所以我想将\ind{whatever}文本中的每个实例更改为\textbf{whatever}\index{whatever by default}.

问题是我确切地知道我想要什么:

  1. 浏览文本,查找任何实例并使用\ind{替换\textbf{search-and-replace
  2. \ind将(在这种情况下为“whatever”)的参数保存在内存中
  3. 问我用户的论点应该是什么\index。默认情况下(按回车键),它应该是第一个参数,但我也可以改变主意并输入不同的内容(在这种情况下为“默认情况下”)。如果没有输入(" "例如只有一个空格),则停止程序。
  4. 写下\index{新的论点和}
  5. 转到文本中的下一个出现。

但是,唉!,我不知道如何做到这一点,所以我需要有人的帮助。如果要花太多时间来解释如何做这样的事情,你能给我发一些关于编写我自己的函数的教程吗?

我希望我很清楚,并感谢您的耐心等待!

4

3 回答 3

6

这种方法对我来说似乎有点不正统,但它很有效,而且对于一次性工作来说似乎已经足够了......

replace-regexpquery-replace-regexp( C-M-%) 的替换文本中,一个较新的转义序列是\,(...),其中...可以是任何 Lisp 表达式。有一个 Lisp 函数read-from-minibuffer可以读取用户输入的任意文本,具有可选的默认值。所以:

C-M-%: 开始query-replace-regexp

\\ind{\([^}]+?\)}:要搜索的模式。

\\textbf{\1}\\index{\,(read-from-minibuffer "index content? " \1)}:替换文本。系统将提示用户将文本放入元素后面的大括号中,默认使用元素\index{}后面大括号之间的原始文本。\ind{}

请注意,使用 时query-replace-regexp,您必须在每个选项后键入以确认每个选项yM-x replace-regexp如果您想避免此步骤,请使用。

于 2011-03-21T03:52:13.150 回答
3

为什么不直接重新定义\ind以便它可以得到一个可选参数呢?

例如:

\newcommand{\ind}[2][]{%
  \def\first{#1}%
  \ifx\first\empty
     \textbf{#2}\index{#2}%
  \else
     \textbf{#2}\index{#1}%
  \fi
}

这样您就可以使用\ind{whatever}\ind[whatever-else]{whatever}

于 2011-03-21T00:52:51.747 回答
3

Vlad 为您的问题提供 LaTeX 答案。Emacs 解决方案是关键宏:从

C-x (

定义一个新的宏,然后执行您的更改的一步,例如:

C-s \ind{
<left>ex

然后复制并粘贴\textbf宏中的参数...您必须小心以可重复的方式移动。完成标准修改后,将光标放在 之后whatever by default并结束定义

C-x )

现在C-x e将调用您刚刚定义的宏,让您的光标在正确的位置更改您想要更改的部分您也可以重复e调用宏一次多次。

于 2011-03-21T02:48:53.787 回答