在文本中使用活动字符而不是宏的优缺点是什么?在 Latex 中实现“简化标记”解析器以使代码更具可读性是否有意义?
基本原理
Latex 风格的内联标记很快就会让人分心。大多数人,比如我,可能只使用一组有限的命令。(我们现在先忽略环境。)可以定义更短的助记宏,比如\bold
给 起别名\textbf
,但这几乎不能节省任何按键——尤其是\
,在某些键盘布局中很难访问。{
}
同时,许多 (ASCII) 标点符号使用不多或仅在特定的空间场景中使用,即一些标点符号被空格字符包围,另一些标点符号一侧有空格,另一侧有字母,还有一些标点符号仅位于数字之后或之前(可能由空格分隔)或仅在数学模式下有用。法语通常有所不同。
很多人和我一样,已经习惯了降价(例如在 SX 上使用),重新结构化文本(rST),纺织品,ASCII文档,Emacs组织模式,黑线鳕或者一些变体维基标记(例如 MediaWiki 或 MoinMoin 语法)。它们都重复使用标点符号来标记纯文本,而不会添加太多可见的噪音。
其中一些在 Latex 中已经是活动字符,例如,,,,\
和,以及数学模式中的,还有一些变体或 选项和。可以激活更多以消除冗长的宏。我认为这就是这样{
}
'
&
$
^
_
babel.sty
enquote.sty
"
~
wiki.sty
有效。tipa.sty
魔法可能以类似的方式起作用。(不过,我更喜欢直接输入 Unicode。)问题是,每个人的需求略有不同,因此这些快捷方式应该是可配置的。
我正在考虑尝试编写一些代码,以便可以轻松地将此类快捷方式添加到某人的文档中,甚至可能达到和之间的源\begin{document}
与\end{document}
markdown 或类似内容无法区分的程度。
唉,我对活跃角色和 catcode 还不太了解。如果每个人都认为我想做的事是个坏主意,那我就省点事了。如果有更懂行的人来做(或者实际上已经做过)这件事,那就更好了。
背景
我正在写关于字素-音素相互关系的语言文本,因此我经常需要包含音位或字形符号,通常是在正常的散文中。我为此定义了宏,例如\grapheme{}
和\phoneme{}
,因为按照惯例,字素是用尖括号括起来的\langle…\rangle
,否则包含起来很麻烦。另一方面,音位转录的斜线很容易输入,但我也更喜欢无衬线字体,因此命令不仅出于结构原因而有意义。还有\phone{}
用于用方括号括起来的音素的语音符号,它们也用于属性(其标识符为大写或设置为小写字母)。由于我对文字学感兴趣,有时我甚至需要将分类字母和字符与实际的图形和字形区分开来,但让我们假设我在的帮助下将它们全部用竖线包围起来\graphe{}
。主要是为了完整性,我还在花括号中定义了\morph{}
和\morpheme{}
以及,\lexeme[]{}
它们只是将强制参数排版为斜体,将可选参数排版为单引号。
\newcommand\wrong[1]{*#1}
\newcommand\ambig[1]{\textsuperscript{?}#1}
\newcommand\phone[1]{\mbox{[\textsf{#1}]}}
\newcommand\phoneme[1]{\mbox{/\textsf{#1}/}}
\newcommand\graphe[1]{\mbox{|#1|}} % SIC!
\newcommand\grapheme[1]{\mbox{$\langle$#1$\rangle$}}
\newcommand\morph[2][]{\mbox{\textup{\{}#2\textup{\}}\textsubscript{#1}}}
\newcommand\morpheme[1]{\morph{\textsc{#1}}}
\newcommand\property[2][±]{\mbox{\textup{[}$#1$#2\textup{]}}}
\newcommand\lexeme[2][]{\textit{#2}\ifthenelse{\isempty{#1}}{}{ ‘#1’}}}
为了满足我的需要,我将尝试获取这些映射(可能会发生变化):
[x]
→\phone{x}
/x/
→\phoneme{x}
<x>
→\grapheme{x}
|x|
→\graphe{x}
\{x\}
? →\morph{x}
((x))
? →\morpheme{x}
[[x]]
,,→[y[x]]
[[x]y]
\property[y]{x}
>x<
,,→>x<y>
<y>x<
\lexeme[y]{x}
*x*
或*x
→\wrong{x}
?x?
或?x
→\ambig{x}
以下一些映射对于更通用的用途也可能有意义:
_x_
或~x~
→\emph{x}
__x__
或~~x~~
→\textit{x}
*x*
→\alert{x}
或\strong{x}
**x**
\textbf{x}
\NL*
→如果需要,\item
可以使用自动环境,也可以使用和或itemize
#
enumerate
;
:
description
+x+
→\textsc{x}
/\person{x}
或{\large x}
++x++
→\MakeUppercase{x}
或{\Large x}
=x=
→\chapter{x}
==x==
→section{x}
等等。
§x§
→\autocite{x}
@x@
→\ref{x}
,\cref{x}
^x^
→\footnote{x}
附言:我知道我可以使用潘多克和类似的工具来生成 make.tex
文件,但它们通常也很难适应个人的 Latex 需求。
PPS:我还知道我可能会遇到问题beamer.cls
,因为<
和的广泛使用>
。
答案1
正如我在评论中指出的那样,如果担心激活字符会破坏某些功能,可以使用开关来设置它们以打开和关闭它们。在这里,我使用左括号和宏\newphoneON
和进行演示\newphoneOFF
。当需要在正常配置中使用左括号时(例如,作为可选宏参数),请使用后者。
\newphonemeON
已更新以显示当结束字符也处于活动状态时如何执行此操作,就像斜线和\newphonemeOFF
用法的情况一样/abc/
(即,\newleftslash
必须在斜线处于活动状态时定义)。
已修订,使生成这些活动字符宏的过程半自动化。我已经将其中的一些放入其中,但其余的需要更多思考,因为它们涉及可选参数,更糟糕的是,活动字符的对称性……例如,我可以<x>
通过使<
活动进行解析;但是,如果我想>x<
通过使>
活动进行解析,它会搞砸先前的定义。
\documentclass{article}
\usepackage[T1]{fontenc}
\textwidth 2.5in\parskip 1em
\newcommand\wrong[1]{\raisebox{-3pt}{*}#1}% EDITED TO PROVIDE DIFFERENT LOOK
\newcommand\ambig[1]{\textsuperscript{?}#1}
\newcommand\phone[1]{\mbox{[\textsf{#1}]}}
\newcommand\phoneme[1]{\mbox{/\textsf{#1}/}}
\newcommand\graphe[1]{\mbox{|\textsf{#1}|}} % SIC!% EDITED TO PROVIDE DIFFERENT LOOK
\newcommand\grapheme[1]{\mbox{$\langle$#1$\rangle$}}
\newcommand\morph[2][]{\mbox{\textup{\{}#2\textup{\}}\textsubscript{#1}}}
\newcommand\morpheme[1]{\morph{\textsc{#1}}}
\newcommand\property[2][±]{\mbox{\textup{[}$#1$#2\textup{]}}}
\newcommand\lexeme[2][]{\textit{#2}\ifthenelse{\isempty{#1}}{}{ ‘#1’}}
\newcommand\newactive[3]{%
\expandafter\let\csname sv#3\endcsname#1
\expandafter\gdef\csname new#3\endcsname##1#2{\csname #3\endcsname{##1}}
\expandafter\def\csname #3ON\endcsname{%
\catcode`#1\active\def#1{\csname new#3\endcsname}}
\expandafter\def\csname #3OFF\endcsname{%
\catcode`#1=12\expandafter\let\expandafter#1\csname sv#3\endcsname}
}
\catcode`[\active\newactive{[}{]}{phone}\catcode`[=12
\catcode`/\active\newactive{/}{/}{phoneme}\catcode`/=12
\catcode`<\active\newactive{<}{>}{grapheme}\catcode`<=12
\catcode`|\active\newactive{|}{|}{graphe}\catcode`|=12
\catcode`*\active\newactive{*}{*}{wrong}\catcode`*=12
\catcode`?\active\newactive{?}{?}{ambig}\catcode`?=12
\def\linguisticsON{\phoneON\phonemeON\graphemeON\ambigON\wrongON\grapheON}
\def\linguisticsOFF{\phoneOFF\phonemeOFF\graphemeOFF\ambigOFF\wrongOFF\grapheOFF}
\begin{document}
Testing normal defs: [[[xyz] /abc/ <x> ?x? *X* |xxx|\par\linguisticsON
Testing phone [xyz], phoneme /abc/, grapheme <xyz>, ambig ?pdq?, wrong *X*, graphe |xyz|\par
\linguisticsOFF back to normal: [[[xyz]]]]] /abc/ <xyz> ?xyz? *X* |xxx|.
\end{document}
原始解决方案
\documentclass{article}
\usepackage[T1]{fontenc}
\textwidth 2in\parskip 1ex
\newcommand\wrong[1]{*#1}
\newcommand\ambig[1]{\textsuperscript{?}#1}
\newcommand\phone[1]{\mbox{[\textsf{#1}]}}
\newcommand\phoneme[1]{\mbox{/\textsf{#1}/}}
\newcommand\graphe[1]{\mbox{|#1|}} % SIC!
\newcommand\grapheme[1]{\mbox{$\langle$#1$\rangle$}}
\newcommand\morph[2][]{\mbox{\textup{\{}#2\textup{\}}\textsubscript{#1}}}
\newcommand\morpheme[1]{\morph{\textsc{#1}}}
\newcommand\property[2][±]{\mbox{\textup{[}$#1$#2\textup{]}}}
\newcommand\lexeme[2][]{\textit{#2}\ifthenelse{\isempty{#1}}{}{ ‘#1’}}
\let\svleftbracket[
\def\newleftbracket#1]{\phone{#1}}
\catcode`[\active
\def\newphoneON{\catcode`[\active\def[{\newleftbracket}}
\def\newphoneOFF{\catcode`[=12\let[\svleftbracket}
\catcode`[=12
\let\svslash/
\catcode`/\active
\def\newleftslash#1/{\phoneme{#1}}
\def\newphonemeON{\catcode`/\active\def/{\newleftslash}}
\def\newphonemeOFF{\catcode`/=12\let/\svslash}
\catcode`/=12
\begin{document}
Testing a normal bracket and slash [[[xyz] /abc/\par
\newphoneON \newphonemeON
Testing the newphoneON [xyz] here and newphonemeON here /abc/ and /def/.\par
\newphoneOFF \newphonemeOFF back to normal bracket [[[xyz]]]]] and slash /abc/.
\end{document}