我想定义一个宏,根据它之前最近的非空白字符执行一些略有不同的操作。虽然我不太愿意深入讨论其使用方面的无关细节,但定义我想要的行为类型相当容易。例如:
\newcommand{\blah}{%
\if\prevnonwschar=.
foo
\else
bar
\fi
}
然后,应该打印以下内容.foo bar
:
.\blah\ \blah
以下内容也应如此(当然,带有换行符):
.
\blah\ \blah
我希望即使文档中没有打印句点也会发生这种情况(在实际情况下,它表示环境的结束)。
什么可以代替\prevnonwschar=.
我做到这一点?
编辑:由于 David Carlisle 的评论,我添加了更多细节。
实际用例是定义一个快捷方式来重新缩放树的分支pst-jtree
。 的 MWEjtree
如下所示:
\documentclass{article}
\usepackage{pstricks}
\usepackage{pst-jtree}
\begin{document}
\jtree
\! = {X}
:{Y} {Z}
:{A} {B}.
\endjtree
\end{document}
请注意,始终用于标记树的末尾(您可以在之后之前.
使用各种命令来绘制各种东西)。pstricks
\endjtree
上述代码产生以下结果:
键scaleby = x y
可用于缩放 的分支jtree
,其中x
和y
是 x 轴和 y 轴的缩放因子。您可以在 后的方括号中为树中的所有分支设置此值\jtree
,也可以通过在scaleby = x y
指定每个节点的花括号前放入方括号来为每个分支单独设置此值,但将其设置为适用于树的所有后续分支通常很有用。这可以按如下方式完成:
\jtree
\! = {X}
:{Y} {Z} "{\psset{scaleby = 2 1}}
:{A} {B}.
\endjtree
此外,您还可以使用内联连接运算符来表示一棵树应与另一棵树中的指定点连接。内联连接运算符以 a 开头!
,后跟可选标签。
\jtree[scaleby = 2 1]
\! = {X}
:{Y}! {Z}.
\! =<left>[scaleby = 1 1]{A} ^ <right>[scaleby = 1 1]{B}.
\endjtree
(:{A} {B}
是的内置快捷方式<left>{A} ^ <right>{B}
,并且不能一致地处理各个分支的缩放,因此需要更复杂的表达式。)
或者,您可以\psset{scaleby = x y}
在第一棵树的定义结束后和第二棵树之前使用来设置所有后面内容的缩放因子(结果与上图相同)。
\jtree[scaleby = 2 1]
\! = {X}
:{Y}! {Z}.
\psset{scaleby = 1 1}
\! =:{A} {B}.
\endjtree
重新缩放树中的所有分支或以下子树是一个相当常见的用例,我正在尝试找到一种更简洁的方式来使用宏来表达它。我现在拥有的宏非常简单,它取代了我想要重新缩放所有内容以从树定义中间的某个点开始的情况。
\newcommand{\rescale}[1]{"{\psset{scaleby = #1}}}
\jtree
\! = {X}
:{Y} {Z} \rescale{0.5 1}
:{A} {B}.
\endjtree
但是给出这个定义,如果我想在子树之间使用它,引号会设置在树上方,某些节点的文本会错位,并且不会发生分支的重新缩放。
\jtree[scaleby = 2 1]
\! = {X}
:{Y} {Z}.
\rescale{1 1}
\! =:{A} {B}.
\endjtree
当然,造成这种情况的原因是在树的中间,必须在宏"{
之前使用psset
,然后}
在宏之后使用,但这在树之间无法正确解释。
鉴于这两个宏的接近性,我想要检查的是命令是否是从树定义内部发出的(我认为通过检查.
宏之前树的末尾标记,可以很好地近似于我的目的)。如果是,它应该使用前面带有"
; 的版本,如果不是,则不应该。这无疑是一个非常小的事情,主要是美观的事情,因为输入完整命令很容易,但是我使用完整命令的次数足够多,以至于只有一种方法可以做到这一点最终可以节省大量的打字时间和一些麻烦。当我需要返回并调整树时,它也会简化事情,因为有时之前位于树中间的东西可能需要移动到新树中,如果重新缩放分支的命令也不需要重新调整,那会很有帮助。
答案1
直接使用\psset
,而不是通过另一个宏:
\jtree[scaleby = 2 1]
\! = {X}
:{Y} {Z}.
\psset{scaleby = 1 1}%
\! =:{A} {B}.
\endjtree