解决Latex soul ul参数中有宏时报错的问题

没有宏时直接用就好了:用soul宏包解决Latex \underline换行问题

但是如果里面有宏则会报错:

\def\testc#{test}
\ul{\testc{}}
Use of \testc doesn't match its definition.

有两种解决方案:

soulregister

这种方案是非侵入式的。

\soulregister\testc7

来源:https://tex.stackexchange.com/questions/139463/how-to-make-hl-highlighting-to-automatically-place-incompatible-commands-in/139500#139500

可以做一个宏来自动化register:

\newcommand{\defmacro}[2]{%
  \expandafter\def\csname#1\endcsname##{#2}
  \expandafter\soulregister\csname#1\endcsname7
}
\defmacro{test}{\emph{Test}}

\expandafter\def表示先展开\def后面的宏。第一个参数#1test,所以\csname#1\endcsname展开之后会变成\test##展开之后会变成#。第二个参数#2\emph{Test}。所以第一句展开之后就变成了\def\test#{\emph{Test}}

同样,\expandafter\soulregister表示先展开\soulregister之后的宏,所以第二句展开之后就变成了\soulregister\test7

提前expand

这种方案需要定义一个新的宏。

\makeatletter
\def\myul#1{%
  \protected@edef\tempa{#1}%
  \ul\tempa%
}
\makeatother

然后用这个新的宏就好了:

\myul{233 \testc{} 2333}

注意这里面\protected@edef不能换成\edef,不然碰上\emph就会炸。

来源:https://tex.stackexchange.com/a/126244/256676

参考:

https://tex.stackexchange.com/questions/244694/writing-to-aux-you-cant-use-a-prefix-with-the-character

https://en.wikibooks.org/wiki/TeX/edef

失败的方案

\def\myul#1{
\def\arga{#1}
\ul\arga
}

这种方法遇到嵌套宏就不行了。

来源:https://tex.stackexchange.com/questions/496833/package-soul-underline-problem-with-macro-text

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值