macro宏

macro脚本元素允许模版设计者定义一段可以重复使用的VTL片断。不论简单的还是复杂的情况,Velocity宏都很有用。作为一个介绍Velocity宏的入门例子,下面的一段Velocity宏只有唯一的目的,就是减少打字的个数和可能发生的打字的错误。

macro( d ) #end

在这个例子中定义的宏的名字为d,并且可以使用类似于其他的VTL指示符的使用格式来调用:#d()
当这个模版被调用的时候,Velocity会使用一个空白的表格单元格来代替。
一个Velocity的宏能够包含零个(在上面这个例子中已经演示了)到任何个数的参数。但当Velocity宏在被调用的时候,调用的参数必须和这个宏在定义的时候定义的参数个数相同。当然,许多Velocity宏都比上面这个例子要复杂。下面是一个带有两个参数的Velocity宏的例子,一个颜色值,一个数组。

macro( tablerows colorsomelist )

foreach( somethinginsomelist )

end

end

这个叫做tablerows的Velocity宏带有两个参数。第一个参数代替了colorsomelist的位置。
任何的能放入模版中的VTL,都能放在Velocity宏中。tablerows包含了一个foreach语句,并且有两个#end语句。第一个数据#foreach,第二个结束了该Velocity宏的定义。

set( $greatlakes = [“Superior”,”Michigan”,”Huron”,”Erie”,”Ontario”] )

set( $color = “blue” )

#tablerows( colorgreatlakes )

注意greatlakessomelist。当这个#tablerows象上面的例子那样调用,输出为:

Superior
Michigan
Huron
Erie
Ontario

Velocity宏可以定义在一个Velocity模版之内,但这是意味在同一应用的其他的模版中该宏是不可见的。定义一个能让所有的模版都能使用的宏又很多的好处:能够减少定义同一个Velocity宏的数量,减少了出错的几率,并且保证了在一处的改变能应用到所有的模版中。
如果#tablerows(colorlist)定义在模版库中,那么这个宏就能在相似的所有的模版中使用了。它能被多次使用于不同的目标。在模版mushroom.vm中,调用#tablerows宏来列出一个典型的蘑菇房。

set( $parts = [“volva”,”stipe”,”annulus”,”gills”,”pileus”] )

set( $cellbgcol = “#CC00FF” )

#tablerows( cellbgcolparts )

当完成了对mushroom.vm的请求,Velocity能在模版库中找到#tablerows宏——需要把这个宏定义在velocity.properties文件中。该例子输出为:

volva
stipe
annulus
gills
pileus

Velocity宏中的参数Velocimacro Arguments
Velocity宏能有下列一些类型的VTL元素:
• 引用:Reference : anything that starts with ‘Stringliteral:somethinglikefoo” or ‘hello’
• 数值:Number literal : 1, 2 etc
• 数值范围:IntegerRange : [ 1..2] or [foo..bar]
• 对象数组:ObjectArray : [ “a”, “b”, “c”]
• boolean value true
• boolean value false
当使用引用作为参数传递给Velocity宏,请注意引用是按名字使用。意味着他们的值是在Velocity宏中每一次的引用都是重新生成的。这个特点允许你传入一个对方法的引用,并且在宏中的每一次引用都调用该方法一次。作为一个例子,下面的代码展示了这一点:

macro( callme $a )

aa
$a

end

callme( $foo.bar() )

在callme宏中,方法引用foo.bar()resultsinthemethodbar()ofthereferencefoo being called 3 times.
初次接触该特性,会感到一些惊讶,但当你比较深入的思考Velocity宏的最初的动机的时候——减少在VTL中对于重复代码的剪切/复制操作。
如果你不需要这种特性,那么你可以总是把方法的值传递给一个变量引用,再把该引用作为参数传递给方法,如下面的例子所示:

set( myval=foo.bar() )

callme( $myval )

Velocity宏的属性Velocimacro Properties
在velocity.properties文件中有几行是用来控制Velocity的宏的。注意这部分在Developer Guide 中也有介绍。
velocimacro.library——以逗号分隔开的Velocity宏模版库的列表。默认情况下,Velocity只寻找VM_global_library.vm.这一个模版库。配制的模版路径用来寻找模版库。
velocimacro.permissions.allow.inline——取值为false或者true。该属性用来规定宏是否能定义在模版中。默认值为true,即允许模版设计者把宏直接定义在模版中。
velocimacro.permissions.allow.inline.to.replace.global——取值为true或者false。该属性规定在模版中定义的宏是否能覆盖在全局宏库(velocimacro.library)中定义的宏。该属性的默认值为false,即阻止定义在模版中的宏覆盖在引擎启动时候加载的全局宏。
velocimacro.permissions.allow.inline.local.scope - 取值为true或者false。该属性控制了在模版中定义的宏是否只对定义该宏的模版可见。

<think>好的,用户问的是关于“tbrun macro”的介绍。首先,我需要确认这个术语的正确性。可能用户指的是TeX或LaTeX中的某个包或命令,比如“\tbrun”或者相关的。 首先,我会回想自己是否听说过“tbrun macro”这个术语。可能用户有拼写错误,比如应该是“tabular”相关的,或者某个特定包中的命令。比如,在LaTeX的表格处理中,有各种包如booktabs、tabularx等,但不确定是否直接关联。 接下来,考虑可能的拼写错误。例如,“tbrun”可能是“tbarun”或其他组合,但暂时没有头绪。或者,用户可能指的是某个特定领域或自定义的。比如在TeX中,用户有时会自定义来简化复杂命令,但“tbrun”并不常见。 然后,检查是否有相关的包名称或命令。搜索LaTeX包仓库或文档,看看是否有“tbrun”相关的信息。假设经过搜索,没有找到直接对应的包或命令,可能这是一个较为生僻的,或者是用户自定义的。 另一种可能性是用户可能混淆了术语,比如将“tabular”中的某些功能或名称记错了。例如,“\hline”或“\multicolumn”等常用表格命令,但和“tbrun”不直接相关。 考虑到用户可能需要帮助,即使不确定准确术语,也应该给出可能的解释。例如,假设用户指的是在表格处理中的,或者与文本处理相关的。另外,可能涉及到的定义方法,比如在LaTeX中如何创建自定义,使用\newcommand等。 此外,可能用户提到的“tbrun”是某个特定领域或软件中的,比如在ConTeXt或其他TeX衍生版本中的命令,但需要进一步确认。 综合以上考虑,由于没有找到明确的“tbrun macro”信息,可能需要向用户说明这一点,并询问更多上下文,或者提供一般性的定义解释,帮助用户了解如何创建和使用自定义。同时,检查是否有拼写错误,建议用户确认术语的正确性,或者提供更多细节以便更准确地回答。</think>根据您提到的“tbrun macro”,目前未在主流TeX/LaTeX文档及包库中找到明确对应的功能或定义。可能存在以下可能性: 1. **术语准确性验证** - 请确认是否为$\texttt{\tb run}$、$\texttt{tb\_run}$等变体拼写 - 可能是自定义名称(常见于用户个性化定义的命令) 2. **常见关联方向推测** - **表格处理**:可能与$\texttt{tabular}$环境相关(例如$\texttt{\\tabularenv}$类命令) - **文本装饰**:类似$\texttt{\\underline}$或$\texttt{\\textbf}$的复合命令 - **编程扩展**:如$\texttt{expl3}$编程体系中的自定义函数 3. **自定义实现示例** 若需创建类似$\texttt{\\tbrun}$的,基础方法如下: ```latex \newcommand{\tbrun}[2]{ \textbf{#1}~\underline{#2} % 示例:粗体+下划线组合格式 } ``` 使用时: ```latex \tbrun{Title}{Content} % 输出:**Title** _Content_ ``` 4. **建议排查步骤** - 检查文档导言区是否有$\texttt{\\newcommand{\\tbrun}}$定义 - 确认是否加载了第三方包(如$\texttt{tcolorbox}$等名称相近的包) - 提供具体使用场景可帮助进一步定位 如需更精准解答,请补充以下信息: - 出现此的文档类型(.tex文件内容片段) - 编译时是否提示“undefined control sequence”错误 - 相关包加载列表 $$\small\text{注:TeX中自定义需严格遵循语法规则,参数传递需用$\texttt{\#1}$标记}$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值