Appearance
自定义宏命令的创建
Liii STEM 支持自定义宏,也支持从 LATEX 直接导入宏。宏适合用来封装高频内容、公式结构和排版样式。
0 术语理解
- 环境 (Environment):具有特定结构和行为的区域。相同内容放在不同环境中,呈现效果可能不同。
- 标记 (Markup):环境的名称,例如
section。 - 焦点 (Focus):当前光标所在的环境,界面中通常会以蓝框显示。
- 排版原语(Primitive):Liii STEM 样式语言内置的基本操作,例如
<with|>、<if|>、<equal|>。 - 宏(Macro):由原语组合而成的可复用命令,可以按需求自定义。
- 标签(Tag):Liii STEM 中的基本排版单位,用于描述结构和格式。
- 结构 (Structure):内容在原语或宏作用下形成的排版结果。
- 结构化输入 / 移动:按文档逻辑单元进行插入、删除和移动。例如在表格中,
Alt+←和Alt+→可以插入列,Alt+↑和Alt+↓可以插入行,Alt+Backspace和Alt+Delete可以执行结构化删除。
1 什么是宏?

宏可以把重复输入的内容封装成一个简短命令。比如把
Southern University of Science and Technology定义成sustech,后续只需要输入宏名即可。
2 宏使用的基本方法
创建一个宏


在菜单栏点击
工具→宏命令→新建宏。在enter-name中输入宏名称,在enter-body中输入宏内容,最后点击使用→确认。创建完成后,按\输入宏名并回车即可调用。
添加参数


打开 Macro editor,将左下角切换到
数学。使用Alt+→添加参数位,之后每次调用宏时,就可以在参数位置填入不同内容。
定义现有的宏
点击焦点工具栏中的
Preference for tag→编辑宏可以打开宏编辑器。复杂宏建议切换到源码,或者直接在导言区中编辑。
3 在导言区编辑宏
进入导言区

点击
文档→部分→显示序言,或使用快捷键Ctrl+Shift+P。
在导言区编辑宏

进入导言区后,可以直接修改已有宏的名称、参数和内容。
在导言区创建宏

输入
\assign生成<assign||>结构后,在第一个|后填写宏名称,在第二个|后填写宏内容。
一些常见的 tips

- 宏需要参数时,先输入
\macro,再用Alt+→添加参数。 - 复杂结构可以嵌套已有宏。编辑矩阵这类结构时,可以先点击模式工具栏中的
激活展开后再修改。 - 输入
\math可以进入数学模式,这样就能在宏体中直接调用数学模式下的宏。 - 使用
if等条件判断原语时,在导言区中编辑通常更方便。
条件判断示例
<assign|test-equal|<macro|arg1|arg2|msg|<if|<equal|arg1|arg2>|Same quantity:arg1|Not equal:msg>>>
这个示例定义了
test-equal宏,用来判断两个参数是否相等。
4 从 LaTeX 中导入宏

Liii STEM 支持从 LATEX 中直接导入宏,适合把已有的 LATEX 命令迁移到 Liii STEM 中继续使用。
5 如何快速熟悉宏命令

使用
Ctrl+Shift+o可以查看文档源码。对照文档效果和源码结构,是熟悉宏命令最快的方法之一。
6 Mogan 样式语言
如果需要编写更复杂的宏,可以先从下面几个最常见的结构开始。
赋值
<assign|hi|<macro|Hi there!>>
assign用于永久设置环境变量。
<with|font-series|bold|color|red|Bold red text>
with用于局部修改环境变量。
<with|strong|<macro|body|<with|font-series|bold|color|red|body>>|<strong|strong> text>
with也可以用于宏的局部重定义。value原语则常用于读取环境变量的值。
宏展开
<assign|my-macro|<macro|x1|...|xn|body>><my-macro|y1|...|yn>第一段用于定义宏,第二段用于调用宏。
<assign|hello|<macro|name|Hello <arg|name>, you look nice today!>>

arg用于读取参数值。
<assign|hey|
<macro|first|second|
<if|
<equal|second|?>|
Hey <arg|first>, you look lonely today...|
Hey <arg|first> and <arg|second>, you form a nice couple!>>>

调用宏时,多余的参数会被忽略;缺少的参数会被视为
uninit。
<assign|my-macro-copy|my-macro>也可以把一个宏赋值给另一个环境变量。
格式化原语
frac是典型的行内标签,Theorem是典型的块级标签。concat用于行内连接,document用于段落级组织。编写宏时,如果要用行内文字包围一个块级标签,需要使用surround。
<assign|my-theorem|
<macro|body|
<surround|<no-indent><with|font-series|bold|Theorem. >|<right-flush>|
body>>>

<assign|very-important|<macro|body|<with|font-series|bold|color|red|body>>><assign|very-important|
<macro|body|
<with|font-series|bold|color|red|
<document|body>>>>

如果希望一个标签始终按块级结构处理,可以在内部使用
document。
基本表格结构标签
<assign|eqnarray*|
<macro|body|
<with|par-mode|center|mode|math|math-display|true|par-sep|0.45fn|
<surround|<no-page-break*><vspace*|0.5fn>|<vspace|0.5fn><no-indent*>|
<tformat|
<twith|table-hyphen|y>
<twith|table-width|1par>
<twith|table-min-cols|3>
<twith|table-max-cols|3>
<cwith|1|-1|1|1|cell-hpart|1>
<cwith|1|-1|-1|-1|cell-hpart|1>
body>>>>>这个例子中,
surround用于包裹块级环境,tformat用于描述表格结构,twith和cwith用于设置表格级和单元格级属性。
<tabular|
<tformat|
<table|
<row|<cell|A1>|<cell|B1>>
<row|<cell|A2>|<cell|B2>>>>>

这是一个最基础的表格结构示例。
<tabular|
<tformat|
<!-- 表格级属性设置 -->
<twith|属性名|属性值>
<twith|属性名|属性值>
...
<!-- 单元格级属性设置 -->
<cwith|行范围|列范围|属性名|属性值>
<cwith|行范围|列范围|属性名|属性值>
...
<!-- 表格内容 -->
<table|
<row|<cell||>|<cell||>>
<row|<cell||>|<cell||>>>>>如果想继续了解底层语言,可以参考:快速入门 Scheme。