仅对大写字母应用操作

仅对大写字母应用操作

我只想将一个函数应用于大写字母,以便:

\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演示)。这应该适用于任何足够新的版本l3kernell3experimental软件包(例如 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%,并使用不同的字体格式化整个内容)

相关内容