Skip to content

自定义宏命令的创建

Liii STEM 支持自定义宏,也支持从 LaTeX\LaTeX 直接导入宏。宏适合用来封装高频内容、公式结构和排版样式。

0 术语理解

  • 环境 (Environment):具有特定结构和行为的区域。相同内容放在不同环境中,呈现效果可能不同。
  • 标记 (Markup):环境的名称,例如 section
  • 焦点 (Focus):当前光标所在的环境,界面中通常会以蓝框显示。
  • 排版原语(Primitive):Liii STEM 样式语言内置的基本操作,例如 <with|><if|><equal|>
  • 宏(Macro):由原语组合而成的可复用命令,可以按需求自定义。
  • 标签(Tag):Liii STEM 中的基本排版单位,用于描述结构和格式。
  • 结构 (Structure):内容在原语或宏作用下形成的排版结果。
  • 结构化输入 / 移动:按文档逻辑单元进行插入、删除和移动。例如在表格中,Alt + Alt + 可以插入列,Alt + Alt + 可以插入行,Alt + BackspaceAlt + 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 等条件判断原语时,在导言区中编辑通常更方便。

条件判断示例

text
<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 中直接导入宏,适合把已有的 LaTeX\LaTeX 命令迁移到 Liii STEM 中继续使用。

5 如何快速熟悉宏命令

使用 Ctrl + Shift + o 可以查看文档源码。对照文档效果和源码结构,是熟悉宏命令最快的方法之一。

6 Mogan 样式语言

如果需要编写更复杂的宏,可以先从下面几个最常见的结构开始。

赋值

text
<assign|hi|<macro|Hi there!>>

assign 用于永久设置环境变量。

text
<with|font-series|bold|color|red|Bold red text>

with 用于局部修改环境变量。

text
<with|strong|<macro|body|<with|font-series|bold|color|red|body>>|<strong|strong> text>

with 也可以用于宏的局部重定义。value 原语则常用于读取环境变量的值。

宏展开

text
<assign|my-macro|<macro|x1|...|xn|body>>
text
<my-macro|y1|...|yn>

第一段用于定义宏,第二段用于调用宏。

text
<assign|hello|<macro|name|Hello <arg|name>, you look nice today!>>

arg 用于读取参数值。

text
<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

text
<assign|my-macro-copy|my-macro>

也可以把一个宏赋值给另一个环境变量。

格式化原语

frac 是典型的行内标签,Theorem 是典型的块级标签。concat 用于行内连接,document 用于段落级组织。编写宏时,如果要用行内文字包围一个块级标签,需要使用 surround

text
<assign|my-theorem|
  <macro|body|
    <surround|<no-indent><with|font-series|bold|Theorem. >|<right-flush>|
      body>>>

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

如果希望一个标签始终按块级结构处理,可以在内部使用 document

基本表格结构标签

text
<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 用于描述表格结构,twithcwith 用于设置表格级和单元格级属性。

text
<tabular|
  <tformat|
    <table|
      <row|<cell|A1>|<cell|B1>>
      <row|<cell|A2>|<cell|B2>>>>>

这是一个最基础的表格结构示例。

text
<tabular|
  <tformat|
    <!-- 表格级属性设置 -->
    <twith|属性名|属性值>
    <twith|属性名|属性值>
    ...

    <!-- 单元格级属性设置 -->
    <cwith|行范围|列范围|属性名|属性值>
    <cwith|行范围|列范围|属性名|属性值>
    ...

    <!-- 表格内容 -->
    <table|
      <row|<cell||>|<cell||>>
      <row|<cell||>|<cell||>>>>>

如果想继续了解底层语言,可以参考:快速入门 Scheme