我开始将LaTeX3
代码嵌入到我的自定义类和包中,并且随着对它的了解越来越多,我越来越喜欢它,但至少对我来说,如果我可以使用一些对代码敏感的编辑器,这将带来更好的体验,这在我经常使用的计算机语言中很常见。LaTeX3
显示敏感的编辑器,这将带来更好的体验,这在我经常使用的计算机语言中很常见。
现在可能有点太早了,因为界面(据我所知,还有实现本身)仍然在开发中,而且并不是所有已经可用的东西都是稳定的,但整体稳定性(如果有这样的事情的话)可能还遥遥领先,而且在我看来,我们已经拥有足够稳定的元素,我们可以从这些编辑功能中受益。
确实,人们总是可以相应地设置一个喜欢的文本编辑器(WinEdt
是我处理所有 TeX 内容的常规编辑器,但我并没有特别使用任何编辑器),但我要求的是已经制作好的东西......并试图引起开发人员对这个主题的关注。
有人知道有哪个编辑器有这种功能吗?有这方面的项目吗?
答案1
更新(2017-02-14)
感谢你花在回答下面的问题上的时间,以及 WinEdt 10.2 中的一些新功能,现在 WinEdt 10.2 真的“对 LaTeX3 敏感”。
WinEdt 10.2 结合了该答案中的突出显示方案(并进行了许多改进),并具有许多其他功能以支持 LaTeX3(例如,使用 等定义的命令和环境的命令完成\NewDocumentCommand
)\NewDocumentEnvironment
。
WinEdt 的完整突出显示方案
expl3
这是WinEdt 8 中的突出显示方案。
新功能:现可作为附加组件使用: LaTeX3
.dtx
突出显示文件中的 LaTeX3 保护
Switches.ini
在开关之前添加以下几行SWITCH="DTX Single Guard"
SWITCH="DTX LaTeX3 Guard"
ENABLED=1
MODE_FILTER="DTX"
START="DTX %"
STOP=">"
HIGHLIGHT_START=1
STEP_OVER_STOP=1
HIGHLIGHT_STOP=1
SCOPE=1
DOMINANT_PRIORITY=0
STRICT_PRIORITY=1
PRIORITY=9
INDENTED=0
BOLN_ONLY=1
CASE_SENSITIVE=1
START1_TRIGGER=""
START2_TRIGGER="<@@="
STOP1_TRIGGER=""
STOP2_TRIGGER=""
TEXT_COLOR=5
BACKGROUND_RGB="$F8F8F8"
TRANSPARENT=144
DEFAULT_FONT=1
结果:
在“树”中收集 LaTeX3 保护
Tree.ini
在分支内添加以下几行BRANCH="Guards-DTX"
,就在行END="</?>"
和之间ITEM="<?>"
ITEM="<@@=?>"
MODE_FILTER="DTX"
CASE_SENSITIVE=1
LINE_START="%"
BEGINNING_OF_LINE_ONLY=2
CURRENT_DOCUMENT_ONLY=1
ALL_OPENED_DOCUMENTS=0
COMPLETE_PROJECT_TREE=1
ICON="ArrowPurple"
LEVEL=0
CAPTION="%?"
MAX_LINE_SPAN=1
ON_CTRL_CLICK_MACRO="GlobalMark;TreeTrack(2);"
ON_CLICK_MACRO="TreeTrack(2,1);"
ON_DBL_CLICK_MACRO="TreeTrack(2,2);"
ACTION="Find"
IMAGE="Find"
MACRO="TreeTrack(2);"
END="<@@=?>"
结果:
突出显示 LaTeX3 命令
FilterSets.ini
在set 之前添加以下几行FILTER_SET="~AlphaNumeric"
FILTER_SET="~Alpha@_:"
ENABLED=0
MODE_FILTER=""
SET=:~(Alpha+["@_:"])
BEFORE=""
AFTER=""
BOLN_NOT_OK=0
EOLN_NOT_OK=0
STRICT_PRIORITY=0
PRIORITY=0
DEFAULT_FONT=1
然后,Switches.ini
在交换机中SWITCH="\"
,将行
STOP="~Alpha@"
和
STOP="~Alpha@_:"
最后,在 中Keywords.ini
,替换所有出现的
AFTER="~Alpha@"
和
AFTER="~Alpha@_:"
结果:
突出显示 LaTeX3 内核关键字
Switches.ini
在开关之前添加以下几行SWITCH="\"
SWITCH="LaTeX3 Kernel Engine Prefixes"
ENABLED=1
MODE_FILTER="TeX"
START="\"
STOP="~Alpha@_:"
HIGHLIGHT_START=1
STEP_OVER_STOP=0
HIGHLIGHT_STOP=0
SCOPE=0
DOMINANT_PRIORITY=0
STRICT_PRIORITY=0
PRIORITY=5
INDENTED=0
BOLN_ONLY=0
CASE_SENSITIVE=1
START1_TRIGGER=""
START2_TRIGGER="luatex_if_engine"
START2_TRIGGER="pdftex_if_engine"
START2_TRIGGER="xetex_if_engine"
STOP1_TRIGGER=""
STOP2_TRIGGER=""
TEXT_COLOR=5
DEFAULT_FONT=1
BOLD=1
SWITCH="LaTeX3 Kernel Prefixes"
ENABLED=1
MODE_FILTER="TeX"
START="\"
STOP="~Alpha@_:"
HIGHLIGHT_START=1
STEP_OVER_STOP=0
HIGHLIGHT_STOP=0
SCOPE=0
DOMINANT_PRIORITY=0
STRICT_PRIORITY=0
PRIORITY=5
INDENTED=0
BOLN_ONLY=0
CASE_SENSITIVE=1
START1_TRIGGER=""
START2_TRIGGER="alloc_"
START2_TRIGGER="bool_"
START2_TRIGGER="box_"
START2_TRIGGER="cctab_"
START2_TRIGGER="char_"
START2_TRIGGER="chk_"
START2_TRIGGER="clist_"
START2_TRIGGER="codedoc_"
START2_TRIGGER="coffin_"
START2_TRIGGER="color_"
START2_TRIGGER="cs_"
START2_TRIGGER="dim_"
START2_TRIGGER="driver_"
START2_TRIGGER="else_"
START2_TRIGGER="etex_"
START2_TRIGGER="exp_"
START2_TRIGGER="expl_"
START2_TRIGGER="fi_"
START2_TRIGGER="fp_"
START2_TRIGGER="group_"
START2_TRIGGER="hbox_"
START2_TRIGGER="hcoffin_"
START2_TRIGGER="if_"
START2_TRIGGER="insert_"
START2_TRIGGER="int_"
START2_TRIGGER="kernel_"
START2_TRIGGER="keys_"
START2_TRIGGER="keyval_"
START2_TRIGGER="lua_"
START2_TRIGGER="luatex_"
START2_TRIGGER="mode_"
START2_TRIGGER="muskip_"
START2_TRIGGER="or_"
START2_TRIGGER="pdftex_"
START2_TRIGGER="peek_"
START2_TRIGGER="prop_"
START2_TRIGGER="quark_"
START2_TRIGGER="reverse_"
START2_TRIGGER="seq_"
START2_TRIGGER="skip_"
START2_TRIGGER="str_"
START2_TRIGGER="tex_"
START2_TRIGGER="tl_"
START2_TRIGGER="token_"
START2_TRIGGER="use_"
START2_TRIGGER="vbox_"
START2_TRIGGER="vcoffin_"
START2_TRIGGER="xetex_"
STOP1_TRIGGER=""
STOP2_TRIGGER=""
TEXT_COLOR=4
DEFAULT_FONT=1
BOLD=1
SWITCH="LaTeX3 File Handling"
ENABLED=1
MODE_FILTER="TeX"
START="\"
STOP="~Alpha@_:"
HIGHLIGHT_START=1
STEP_OVER_STOP=0
HIGHLIGHT_STOP=0
SCOPE=0
DOMINANT_PRIORITY=0
STRICT_PRIORITY=0
PRIORITY=5
INDENTED=0
BOLN_ONLY=0
CASE_SENSITIVE=1
START1_TRIGGER=""
START2_TRIGGER="file_"
START2_TRIGGER="g_file_"
START2_TRIGGER="ior_"
START2_TRIGGER="iow_"
START2_TRIGGER="l_ior_"
START2_TRIGGER="l_iow_"
STOP1_TRIGGER=""
STOP2_TRIGGER=""
TEXT_COLOR=2
DEFAULT_FONT=1
BOLD=1
SWITCH="LaTeX3 Package Messages"
ENABLED=1
MODE_FILTER="TeX"
START="\"
STOP="~Alpha@_:"
HIGHLIGHT_START=1
STEP_OVER_STOP=0
HIGHLIGHT_STOP=0
SCOPE=0
DOMINANT_PRIORITY=0
STRICT_PRIORITY=0
PRIORITY=5
INDENTED=0
BOLN_ONLY=0
CASE_SENSITIVE=1
START1_TRIGGER=""
START2_TRIGGER="msg_"
STOP1_TRIGGER=""
STOP2_TRIGGER=""
TEXT_COLOR=9
DEFAULT_FONT=1
ITALIC=1
SWITCH="LaTeX3 NoOp Functions"
ENABLED=1
MODE_FILTER="TeX"
START="\"
STOP="~Alpha@_:"
HIGHLIGHT_START=1
STEP_OVER_STOP=0
HIGHLIGHT_STOP=0
SCOPE=0
DOMINANT_PRIORITY=0
STRICT_PRIORITY=0
PRIORITY=5
INDENTED=0
BOLN_ONLY=0
CASE_SENSITIVE=1
START1_TRIGGER=""
START2_TRIGGER="prg_"
START2_TRIGGER="scan_"
STOP1_TRIGGER=""
STOP2_TRIGGER=""
TEXT_COLOR=3
DEFAULT_FONT=1
BOLD=1
Keywords.ini
然后,在组之前添加以下几行KEYWORD_GROUP="TeX Units"
KEYWORD_GROUP="LaTeX3 Keywords"
ENABLED=1
MODE_FILTER="TeX"
BEFORE="\ (single)"
AFTER="~Alpha@_:"
BOLN_NOT_OK=1
EOLN_NOT_OK=0
STRICT_PRIORITY=0
PRIORITY=6
CASE_SENSITIVE=1
TEXT_COLOR=0
DEFAULT_FONT=1
BOLD=1
UNDERLINE=1
LIST="END_LIST"
ExplSyntaxOff
ExplSyntaxOn
END_LIST
KEYWORD_GROUP="LaTeX3 Keywords..."
ENABLED=1
MODE_FILTER="TeX"
BEFORE="\ (single)"
AFTER="~Alpha@_:"
BOLN_NOT_OK=1
EOLN_NOT_OK=0
STRICT_PRIORITY=0
PRIORITY=6
CASE_SENSITIVE=1
TEXT_COLOR=4
DEFAULT_FONT=1
BOLD=1
LIST="END_LIST"
DeclareDocumentCommand
DeclareDocumentEnvironment
NewDocumentCommand
NewDocumentEnvironment
ProvideDocumentCommand
ProvideDocumentEnvironment
RenewDocumentCommand
RenewDocumentEnvironment
END_LIST
结果:
突出显示 LaTeX3 属性和常量
这是对此能做的最好的事情了。
FilterSets.ini
在set 之前添加以下几行FILTER_SET="="
FILTER_SET="."
ENABLED=0
MODE_FILTER=""
SET=:["."]
BEFORE=""
AFTER=""
BOLN_NOT_OK=0
EOLN_NOT_OK=0
STRICT_PRIORITY=0
PRIORITY=0
DEFAULT_FONT=1
Switches.ini
然后,在开关之前SWITCH="\"
(新定义的开关之后SWITCH="LaTeX3 Kernel Prefixes"
)添加以下几行
SWITCH="LaTeX3 Properties"
ENABLED=1
MODE_FILTER="TeX"
START="."
STOP=":"
HIGHLIGHT_START=1
STEP_OVER_STOP=1
HIGHLIGHT_STOP=1
SCOPE=0
DOMINANT_PRIORITY=0
STRICT_PRIORITY=0
PRIORITY=5
INDENTED=0
BOLN_ONLY=0
CASE_SENSITIVE=1
START1_TRIGGER=""
START2_TRIGGER="code"
START2_TRIGGER="choice"
START2_TRIGGER="choice_code"
START2_TRIGGER="generate_choices"
START2_TRIGGER="initial"
START2_TRIGGER="default"
START2_TRIGGER="meta"
START2_TRIGGER="alloc_"
START2_TRIGGER="bool_"
START2_TRIGGER="box_"
START2_TRIGGER="cctab_"
START2_TRIGGER="char_"
START2_TRIGGER="chk_"
START2_TRIGGER="clist_"
START2_TRIGGER="codedoc_"
START2_TRIGGER="coffin_"
START2_TRIGGER="color_"
START2_TRIGGER="cs_"
START2_TRIGGER="dim_"
START2_TRIGGER="driver_"
START2_TRIGGER="else_"
START2_TRIGGER="etex_"
START2_TRIGGER="exp_"
START2_TRIGGER="expl_"
START2_TRIGGER="fi_"
START2_TRIGGER="file_"
START2_TRIGGER="fp_"
START2_TRIGGER="group_"
START2_TRIGGER="hbox_"
START2_TRIGGER="hcoffin_"
START2_TRIGGER="if_"
START2_TRIGGER="insert_"
START2_TRIGGER="int_"
START2_TRIGGER="ior_"
START2_TRIGGER="iow_"
START2_TRIGGER="kernel_"
START2_TRIGGER="keys_"
START2_TRIGGER="keyval_"
START2_TRIGGER="lua_"
START2_TRIGGER="luatex_"
START2_TRIGGER="mode_"
START2_TRIGGER="msg_"
START2_TRIGGER="muskip_"
START2_TRIGGER="or_"
START2_TRIGGER="pdftex_"
START2_TRIGGER="peek_"
START2_TRIGGER="prg_"
START2_TRIGGER="prop_"
START2_TRIGGER="quark_"
START2_TRIGGER="reverse_"
START2_TRIGGER="scan_"
START2_TRIGGER="seq_"
START2_TRIGGER="skip_"
START2_TRIGGER="str_"
START2_TRIGGER="tex_"
START2_TRIGGER="tl_"
START2_TRIGGER="token_"
START2_TRIGGER="use_"
START2_TRIGGER="vbox_"
START2_TRIGGER="vcoffin_"
START2_TRIGGER="xetex_"
STOP1_TRIGGER=""
STOP2_TRIGGER="n"
STOP2_TRIGGER="N"
STOP2_TRIGGER="x"
TEXT_COLOR=1
DEFAULT_FONT=1
ITALIC=1
SWITCH="LaTeX3 Kernel Constants"
ENABLED=1
MODE_FILTER="TeX"
START="\"
STOP="~Alpha@_:"
HIGHLIGHT_START=1
STEP_OVER_STOP=0
HIGHLIGHT_STOP=0
SCOPE=0
DOMINANT_PRIORITY=0
STRICT_PRIORITY=0
PRIORITY=5
INDENTED=0
BOLN_ONLY=0
CASE_SENSITIVE=1
START1_TRIGGER=""
START2_TRIGGER="c_"
STOP1_TRIGGER=""
STOP2_TRIGGER=""
TEXT_COLOR=6
DEFAULT_FONT=1
ITALIC=1
结果:
答案2
记录一下,这是我在 Emacs 和 LaTeX3 中设置的字体锁定。为了使用这些设置,我定义了一个latex3-mode
从 inbuild 派生的latex-mode
字体锁定。(注意:我不使用 AucTeX,我使用简单的 TeX 模式。)字体锁定的想法与 Joseph 的想法类似,因为它增加了更多匹配以进行突出显示。我specials
为核心函数添加了一个(可能尚未全部包含)。带有一个的宏_
和不带有一个的宏之间也有区别(例如普通的 LaTeX2e 宏/函数和这些xparse
宏)。我可能需要定义更多的面来进一步区分,但目前对我来说这已经足够好了。
(defconst latex3-font-lock-keywords
(eval-when-compile
(let* (;; Commands relevant to data structures
(specials "\\(bool\\|char\\|clist\\|cs\\|exp\\|file\\|group\\|keys\\|prop\\|q\\|seq\\|tl\\)_[a-zA-Z_:]+")
(general "\\([a-zA-Z_:]+\\)")
(camel "\\([a-zA-Z@]+\\)")
(nocamel "\\(?:[^a-zA-Z@_:]\\)")
(slash "\\\\")
)
(list
(list (concat "\\(" slash specials "\\)")
1 'font-lock-function-name-face)
(list (concat "\\(" slash camel "\\)" nocamel) 1 'font-lock-function-name-face)
(list (concat "\\(" slash general "\\)") 1 'font-lock-variable-name-face)
)
)
)
"Extra commands to highlight in LaTeX3 modes."
)
(define-derived-mode latex3-mode latex-mode "LaTeX3"
"Major mode to edit LaTeX3 files."
(set (make-local-variable 'font-lock-defaults)
'((tex-font-lock-keywords latex3-font-lock-keywords)
nil nil ((?$ . "\"")) nil
;; Who ever uses that anyway ???
(font-lock-mark-block-function . mark-paragraph)
(font-lock-syntactic-face-function
. tex-font-lock-syntactic-face-function)
(font-lock-unfontify-region-function
. tex-font-lock-unfontify-region)
(font-lock-syntactic-keywords
. tex-font-lock-syntactic-keywords)
(parse-sexp-lookup-properties . t)))
)
(add-hook 'latex3-mode-hook (function (lambda () (setq ispell-parser 'tex))))
(add-hook 'latex3-mode-hook '(lambda () (flyspell-mode 0)))
下面是一个屏幕截图(您可以看到我应该将 添加box
到vbox
我的特殊功能列表中):
答案3
特克斯沃克斯使用基于正则表达式的简单方法进行语法突出显示,信息存储在文件syntax-patterns.txt
夹内的文件中TeXworks/configuration
,该文件位于系统相关的位置。我有一套用于处理.dtx
(LaTeX 文档源)文件的模式,其中包括expl3
代码突出显示:
[LaTeX DTX]
# comments
red Y \^\^A.*
# Guards
orange N %<(?:[A-Za-z0-9!\|]+|.)>
limegreen N %<\*(?:[A-Za-z0-9!\|]+|.)>
crimson N %</(?:[A-Za-z0-9!\|]+|.)>
darkviolet N %<@@=(?:[A-Za-z]+|.)>
# special characters
darkred N \^\^\^\^\^[0-9a-z]{5}
darkred N \^\^\^\^[0-9a-z]{4}
darkred N \^\^\^[0-9a-z]{3}
darkred N \^\^[0-9a-z]{2}
darkred N [$#^_{}&]
gray N ^%%.*
gray N ^%
# Macrocode
green N \\(?:begin|end)\{macrocode\}
# LaTeX environments
darkgreen N \\(?:begin|end)\s*\{[^}]*\}
# control sequences
blue N \\(?:[A-Za-z@:_]+|.)
(配色方案基于 WinEdt 用于.dtx
编辑的方案,因为我以前使用过 WinEdt。)
关键行是最后一行,因为正则表达式\\(?:[A-Za-z@:_]+|.)
匹配expl3
“标准”LaTeX2e 宏名称。如果您只想用expl3
一种颜色突出显示代码级宏,则可以使用类似
# functions
blue N \\(?:[A-Za-z_]+):(?:[A-Za-z_:]+|.)
# Variables
blue N \\(?:[A-Za-z_]+)_(?:[A-Za-z_]+|.)
这样就不会突出显示文档/设计级别(仅突出显示名称中的字母)或 LaTeX2e 内部(@
名称中的)控制序列。当然,您可以做得更复杂,并给它们都不同的突出显示!您还可以像 Andrew Stacey 在他的回答expl3
使用更复杂的正则表达式来区分核心名称和“附加”名称。
请注意,我还扩展了.dtx
可识别的防护,以覆盖添加到“标准”集的%<@@=...>
防护,用于标记内部名称。它由以下行覆盖l3doscrip
darkviolet N %<@@=(?:[A-Za-z]+|.)>
我必须找到一种新的颜色来适应已经在使用的颜色!