我理解\bf
和\it
在 LaTeX 中已经过时,并且\textbf
和\textit
是正确的,因为它们会对字体样式产生更复杂的(特别是累积的和正确的字距调整的)更改。我已阅读l2tabu 的“过时的命令和包”v. 1.8.5.7 的英文版本,第 2.1 节我了解这些规则及其原因,以及受影响的其他几个命令。
不过,我发现在讲座上使用 LaTeX 做笔记非常方便,在那种匆忙的环境中,通过任意数量的击键来缩短命令有助于让我不落后。\bf
因此,它的两个字母的同类对我来说仍然非常有用,并且一旦演示结束,我就可以浏览并将所有出现的\bf
et al. 替换为\textbf
et al。
我的问题是:是否有计划最终\bf
用等的实现来取代短字体样式命令\textbf
,或者我应该期望它们\bf
始终存在但过时,以便与原始 TeX 向后兼容?原始 TeX 在无数方面得到了极大的改进,但在转录的热潮中,我有时会怀念它的简洁性。
答案1
简单的答案是否定的,因为新的字体命令由于您引用的链接中的原因而更好地发挥作用。
减少输入的最佳方法是自定义编辑器。在我的编辑器(Mac 上的 TeXShop)中,我将命令\textbf{}
绑定到 Command-B 和\emph{}
Command-I。(我一般不使用textit{}
)这使得在我的源代码中使用“新”字体命令变得简单,但输入量却大大减少。
大多数编辑应该能够使用这种快捷方式。
答案2
EDIT2:现在有一个markdown
包,可以与LuaTeX引擎一起使用。
根据 评论中提到的 markdown 想法@Emre
,它可以用 LaTeX 编码。例如,下面的代码使*italics*
和**bold**
工作(也可以嵌套)。
\documentclass{article}
\makeatletter
\newcommand{\star@out}{%
\star@ifnext{\bgroup\bfseries\let\star@current\star@inbf\@gobble}%
{\bgroup\itshape\let\star@current\star@init}}
\newcommand{\star@inbf}{%
\star@ifnext{\egroup\@gobble}{\bgroup\itshape\let\star@current\star@initbf}}
\newcommand{\star@init}{%
\star@ifnext{\bgroup\bfseries\let\star@current\star@initbf}{\egroup}}
\newcommand{\star@initbf}{\star@ifnext{\egroup\@gobble}{\egroup}}
\let\star@current\star@out
\newcommand{\star@ifnext}[2]{%
\def \reserved@a {#1}%
\def \reserved@b {#2}%
\futurelet \@let@token \star@ifnext@aux
}
\begingroup
\catcode`\*=13
\@firstofone{\endgroup
\newcommand{*}{\star@current}
\newcommand{\star@ifnext@aux}{%
\ifx \@let@token *\let \reserved@c \reserved@a
\else \let \reserved@c \reserved@b
\fi
\reserved@c
}
}
\makeatother
\AtBeginDocument{\catcode`\*=13}
\begin{document}
Hello, *th**i**s* is a **test, *to see* whether** it works.
\end{document}
根据 Hendrik Vogt 的建议进行编辑。构造
\begingroup
\catcode`\*=13
\@firstofone{\endgroup ... }
确保*
参数中的每个\@firstofone
都有 catcode 13
。也就是说,启动一个组,其中*
是活动的,然后\@firstofone
不执行任何操作,只是强制 TeX 读取其参数,将输入文件的字符转换为标记(catcode 固定,除非有人稍后使用\scantokens
),然后该组以 结束\endgroup
。 的 catcode*
被恢复,这意味着*
稍后读取的任何 (即 参数中的 除外\@firstofone
)都将是 catcode 12
(其他)。这种构造相对于执行的优势\catcode`=13
之前和\catcode`
=12
之后是,的 catcode*
会保留其原有的任何值,即使它不是12
。
答案3
为了扩展艾伦的好答案(并重申他的“不') 还有另一个重要原因,现在不推荐使用\bf
和\it
:它们很短,易于输入,但没有语义。LaTeX 试图在其标记中分离内容和格式,而这些字体更改命令破坏了这种理想。
粗略地说,作为文档一部分经常输入的命令应该简短而有意义;定义格式决策的命令应该长而具有描述性。
答案4
首先,关于在 LaTeX 文档中使用基于 PlainTeX 的字体切换命令\rm
、\sf
、\tt
等:尽管 LaTeX2e 内核没有定义这些命令,但实际上它们仍然可用如果您可以使用“标准”文档类之一—— article
、report
和book
——或基于这三个类的文档类。有关如何在、和类中实现、等的更多信息\rm
,请参见\sf
,例如article
report
book
这个答案发帖有什么理由不使用 \let 将已弃用的控制序列重新定义为当前推荐的控制序列吗?
其次,这里有一个解决方案,它使用 LuaLaTeX 将一些简单的 markdown 类型的文本格式化“指令”转换为 LaTeX 代码。具体来说,一行输入中匹配的 、 和 字符对内***
的**
文本*
将以粗斜体,大胆的, 和斜体, 分别。
执行主要工作的 Lua 函数的操作可以通过两个名为\MarkdownOn
和 的LaTeX 宏来启动和终止\MarkdownOff
。Lua 函数不对包含在verbatim
类似环境中的材料进行操作。
\documentclass{article}
%% Lua-side code
\usepackage{luacode}
\begin{luacode}
in_verbatim = false
function markdown ( line )
-- don't operate on input if we're in a verbabim-type environment
if string.find ( line , "\\begin{[vV]erbatim}" ) then
in_verbatim = true
elseif string.find ( line , "\\end{[vV]erbatim}" ) then
in_verbatim = false
elseif in_verbatim == false then
line = string.gsub ( line, "%*%*%*(.-)%*%*%*" , "\\textbf{\\textit{%1}}")
line = string.gsub ( line, "%*%*(.-)%*%*" , "\\textbf{%1}")
line = string.gsub ( line, "%*(.-)%*" , "\\textit{%1}" )
end
return line
end
\end{luacode}
%% TeX-side code
\newcommand\MarkdownOn{\directlua{luatexbase.add_to_callback(
"process_input_buffer", markdown, "markdown" )}}
\newcommand\MarkdownOff{\directlua{luatexbase.remove_from_callback(
"process_input_buffer", "markdown" )}}
\setlength\parindent{0pt} % just for this example
\begin{document}
\MarkdownOn
Lua function \texttt{markdown} turned on:
*italic*, **bold**, ***bold italic***
\bigskip
A line inside a \texttt{verbatim} environment:
\begin{verbatim}
*italic*, **bold**, ***bold italic***
\end{verbatim}
\bigskip
\MarkdownOff
Lua function \texttt{markdown} turned off:
*italic*, **bold**, ***bold italic***
\end{document}