我正在使用 LyX 记录一个软件项目,我描述的许多“事物”(类、流程等)还没有好名字。随着我对这些事物的理解不断加深,我想给它们起更好的名字。但我不想因为搜索替换不及时而导致某个事物被多个名称引用。
我隐约记得 LyX 中有一种方法可以插入对术语的引用,当引用的术语被修改时,该引用会自动更新。例如,如果我有一个名为“关于 Foobar 的一切”的部分,我可以在后续文本中插入对“Foobar”的引用。如果我决定为 Foobar 取一个更具描述性的名称,比如 Bazqux,我只需更新部分标题,然后——噗!——每个 Foobar 都变成了 Bazqux。
这是一件很简单的事情,但是今天下午我的 Google 能力很差。或者我疯了,根本就没有这样的功能。
答案1
目前还不清楚你到底想要什么。但你可以轻松定义一个宏,它能拼出名称,因此可以在文档中更改一次。例如,如果你现在有一个叫做“class”的东西,你可以定义以下宏:
\newcommand*{\class}{class}
(*
这里的意思是宏不能包含任何段落分隔符;有关此内容的更多详细信息,请参阅下面的问题。
\newcommand 和 \newcommand* 之间有什么区别?
然后,在文本中,你需要\class
在需要该对象名称的每个地方输入该对象名称。如果你决定要将某个类称为方法,您只需重新定义\class
宏:
\newcommand*{\class}{method}
对于这种解决方案,您需要记住以下几点。首先,宏后的空格会被忽略,因此如果您的源代码有
In this \class we strip out spaces.
它将呈现为在这节课中我们去掉空格,这不是您想要的。您不能简单地在定义中添加空格,因为这会错误地在您不想要的标点符号之前添加空格。因此,有两种方法可以解决这个问题。一种是使用 ,在需要空格时简单地插入一个明显的空格\
:
In this \class\ we strip out spaces.
另一个解决方案是使用xspace
包,它会自动插入空格并处理不是在标点符号前插入空格。
\usepackage{xspace}
\newcommand*{\class}{class\xspace}
那么你就不需要自己输入显式空格了。但是请注意,使用这种xspace
方法有一些缺点。请参阅:
以这种方式定义替换宏的第二个缺陷是,它们不会根据复数和大写等情况进行调整。要捕捉这些情况,最简单的方法可能是简单地定义宏本身的大写和复数版本。(您可以做其他更花哨的事情,但代价是让您的源代码更难读。)因此,您可以定义:
\newcommand*{\Class}{Class}
\newcommand*{\classes}{\class es}
\newcommand*{\Classes}{\Class es}
Will Robertson 的以下文章是有关此类技术的有用指南:
这是一份小文档,其中包含了上述所有示例。
\documentclass{article}
\usepackage[margin=1in]{geometry}
\usepackage{xspace}
\newcommand*{\class}{class} % if your command will have multiple lines omit the *
\newcommand*{\Class}{Class} % uppercase version
\newcommand*{\classes}{\class es} % plural versions
\newcommand*{\Classes}{\Class es}
\begin{document}
If we don't add an explicit space after the \class macro it doesn't work as we expect.
We can make the \class\ macro work by adding the space explicitly.
Or if we change the macro to use the xspace package, it will insert the space automatically:
\renewcommand*{\class}{class\xspace}
Now the \class macro inserts a space, but not when there is punctuation following \class.
\end{document}
我在这里唯一没有提到的是如何在 LyX 中完成所有这些操作。定义\newcommand
会像您将任何其他原始 LaTeX 代码添加到文档中一样进入文档序言中。如果您将大量使用它们,那么创建 LyX 布局来执行此操作可能会很有用。有关如何向 LyX 添加自定义环境的更多信息,请参阅:
答案2
答案3
输入以下内容Document > Settings > Local Layout
:
InsetLayout "Flex:myTextMacroInset"
LabelString "My Text Macro"
LatexType Command
LaTexName myTextMacro
LyxType "custom"
Decoration Classic
Preamble
\newcommand{\myTextMacro}{Foobar}
EndPreamble
End
然后,您就可以Insert > Custom Insets > myTextMacroInset
在 LyX 文档中的任何位置执行此操作。您还可以flex-insert "myTextMacroInset"
在 中添加命令的快捷方式Tools > Prefs > Editing > Shortcuts
。
一些评论:
- 我以为有一种方法可以创建插图,而无需使用文本输入框。但我不明白这一点。
LatexType "None"
您可以通过直接使用和插入文本(也许使用)使此过程更简单一些LeftDelim
,但导出到 LaTeX 时,“常量”宏将不会保留。这只会是一个 LyX 常量。