基本原理

基本原理

在文本中使用活动字符而不是宏的优缺点是什么?在 Latex 中实现“简化标记”解析器以使代码更具可读性是否有意义?

基本原理

Latex 风格的内联标记很快就会让人分心。大多数人,比如我,可能只使用一组有限的命令。(我们现在先忽略环境。)可以定义更短的助记宏,比如\bold给 起别名\textbf,但这几乎不能节省任何按键——尤其是\,在某些键盘布局中很难访问。{}

同时,许多 (ASCII) 标点符号使用不多或仅在特定的空间场景中使用,即一些标点符号被空格字符包围,另一些标点符号一侧有空格,另一侧有字母,还有一些标点符号仅位于数字之后或之前(可能由空格分隔)或仅在数学模式下有用。法语通常有所不同。

很多人和我一样,已经习惯了降价(例如在 SX 上使用),重新结构化文本(rST),纺织品ASCII文档,Emacs组织模式黑线鳕或者一些变体维基标记(例如 MediaWiki 或 MoinMoin 语法)。它们都重复使用标点符号来标记纯文本,而不会添加太多可见的噪音。

其中一些在 Latex 中已经是活动字符,例如,,,,\和,以及数学模式中的,还有一些变体或 选项和。可以激活更多以消除冗长的宏。我认为这就是这样{}'&$^_babel.styenquote.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}

相关内容