我只想将一个函数应用于大写字母,以便:
\emphcaps{YaWeH}
输出如下:
\emph{Y}a\emph{W}e\emph{H}
最好不要使用太多包(我已经使用了memoir
)。
注意:我使用 XeLaTeX(因为它的双向支持似乎最好)。
答案1
\documentclass[a4paper]{article}
\makeatletter
\DeclareRobustCommand{\emphcap}[1]{\begingroup\emph@cap#1\@nil\endgroup}
\def\emph@cap#1{%
\ifx#1\@nil
\expandafter\@gobble
\else
\emph@@cap{#1}%
\fi
\emph@cap}
\def\emph@@cap#1{%
\ifnum\uccode`#1=`#1\relax
\itshape#1\emph@captrue
\else
\ifemph@cap\/\else\fi\upshape#1\emph@capfalse
\fi}
\newif\ifemph@cap
\makeatother
\begin{document}
\emphcap{THiSiSWHaTIWaNT}
\end{document}
这假设你的输入仅包含普通字母(无重音符号)。结果非常丑陋。
答案2
一种使用 LaTeX3 的方法:重要的命令是\regex_replace_all:nnN
。它的第一个参数是正则表达式(这里,[A-Z]
匹配任何大写字母);它的第二个参数是替换,这里\textit
后面跟着\0
(正则表达式匹配的内容);第三个是标记列表变量我们想要进行替换。
\documentclass[a4paper]{article}
\usepackage{l3regex}
\ExplSyntaxOn
\cs_new_protected:Npn \emphcap #1
{
\tl_set:Nn \l_tmpa_tl {#1}
\regex_replace_all:nnN { [A-Z] } { \c{textit} \0 } \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\emphcap{THiS iS \texttt{WHaT} I WaNT}
\end{document}
当然,空格会被保留,参数中的任何格式化命令也是如此(我在这里放置了\texttt
演示)。这应该适用于任何足够新的版本l3kernel
和l3experimental
软件包(例如 2012 年 2 月)。
或者,你可以使用替换
\regex_replace_all:nnN { [A-Z]+ } { \c{textit} \cB\{ \0 \cE\} } \l_tmpa_tl
我修改了正则表达式以匹配任意数量的连续大写字母,并修改了替换文本以在参数周围添加括号\textit
。这避免了在中插入额外的空格\textit{N}\textit{T}
。输出:
答案3
好的,这是另一种专门针对 LuaLaTeX 粉丝(以及未来的 LuaLaTeX 粉丝)的方法。我认为这是一个很好的例子,可以展示编写几行(易于理解的)Lua 代码是多么容易。在提供的 Lua 代码中,可以检查输入字符串中的每个字符,并格式化所需的任何 LaTeX 字符串,而无需使用神秘的 TeX 命令。
将 lua 函数写在扩展名为 .lua 的单独文件中是一种很好的做法。对于此 MWE,我使用环境filecontents
来为 lua 脚本提供额外的文件。
\documentclass{book}
\usepackage{filecontents}
\begin{filecontents*}{luaFunctions.lua}
function emphcaps(input)
outputString = ""
len = string.len(input)
for i = 1, len, 1 do --for each char in string
ascii = string.byte(input, i) -- convert the char in a decimal
if(ascii >= 65 and ascii <= 90) then -- upper case (look to the ASCII table)
outputString = outputString.."\\emph{"..string.char(ascii).."}"
else
outputString = outputString..string.char(ascii)
end
end
tex.print(outputString)
end
\end{filecontents*}
% read the external lua file to declare the defined function,
% but without execute the Lua function
\directlua{dofile("luaFunctions.lua")}
% latex command to execute the lua function
\def\emphcaps#1{\directlua{emphcaps("#1")}}
\begin{document}
\noindent
\emphcaps{YaWeH}\\
\emphcaps{LuaLaTeX}
\end{document}
编辑:在 Khaled Hosny 发表了精彩评论后,我想提供一个非常直接的解决方案。它再次展示了 Lua 的强大功能 ;-)。新函数将所有(这就是后面所代表的+
)%u
大写字符(这就是所代表%u
的)替换为\emph{}
。保存搜索模式中%1
被包围的值。( )
function emphcaps(input)
output, count = string.gsub(input, '(%u+)', '\\emph{%1}')
tex.print(output)
end
答案4
dl903
我从irc://irc.freenode.net/#latex
\def\capOnlyEmph#1{\mycaps#1\relax.}\def\mycaps#1#2.{\ifnum`#1<97\emph{#1}\else#1\fi\ifx#2\relax\else\mycaps#2.\fi}
\capOnlyEmph{ALLaH, YaWeH}
我在我的文档中使用它来格式化闪族/阿拉伯语的音译。(\emph
我没有使用命令,而是使用relsize
包将大写字母缩小 15%,并使用不同的字体格式化整个内容)