Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

xeCJK 造成命令参数中的 \lstinline 中的 # 号表示不正确 #378

Open
bubifengyun opened this issue Sep 21, 2018 · 6 comments
Open
Assignees

Comments

@bubifengyun
Copy link

bubifengyun commented Sep 21, 2018

发现一个小问题,ctexbook 对 lstinline 显示不正常。bubifengyun/deepin-bible#15

源码

% file test.tex
\documentclass{ctexbook}
\RequirePackage{pageslts}
\RequirePackage[backend=biber,style=gb7714-2015]{biblatex}
\RequirePackage{listings}

\newcommand{\passthrough}[1]{#1}
\begin{document}
\passthrough{\lstinline!#!} and \lstinline!#! are not the same
\end{document}

如果调用命令 xelatex test.tex, 结果却是 ## and # are not the same
_ _20180921094156

如果是\documentclass{article}就是正常的结果。

@Liam0205
Copy link
Contributor

应该是 xeCJKlistings 的补丁带来的问题。

\documentclass{article}

% \usepackage{xeCJK}
\usepackage{listings}

\newcommand{\passthrough}[1]{#1}

\begin{document}
\passthrough{\lstinline!#!} and \lstinline!#! are not the same
\end{document}

@bubifengyun
Copy link
Author

试了一下,果然如此。应该是xeCJK的问题了,那谁来维护他啊。感觉有点追根溯源了。

@leo-liu leo-liu added the bug label Sep 26, 2018
@leo-liu leo-liu changed the title ctexbook 是不是在这里勘误 xeCJK 造成 \lstinline 中的 # 号表示不正确 Sep 26, 2018
@leo-liu leo-liu changed the title xeCJK 造成 \lstinline 中的 # 号表示不正确 xeCJK 造成命令参数中的 \lstinline 中的 # 号表示不正确 Sep 26, 2018
@leo-liu
Copy link
Member

leo-liu commented Sep 26, 2018

这种一般是 @qinglee 来修,这部分代码主要是他维护的。如果他有空的话。

短时间内建议你绕过去,如果可能的话。毕竟在参数中使用 \lstinline 也不是特别常用的,且本身也经常会带来问题(比如你放在 \emph 里面试试)。

一个简单的绕过方法是使用 cprotect 宏包:

\documentclass{article}
\usepackage{xeCJK}
\usepackage{listings}
\usepackage{cprotect}

\newcommand\foo[1]{#1}
\begin{document}

\cprotect\foo{\lstinline|foo#bar|}

\end{document}

@bubifengyun
Copy link
Author

非常感谢。我也觉得那个问题太多了。

@bubifengyun
Copy link
Author

bubifengyun commented Sep 26, 2018

刚刚试了一下,是因为使用 pandoc 在生成 something 括起来的内容的时候,添加passthrough这一功能引起的。暂时没有办法把 \cprotect 放在最前。正在着手修改 pandoc 代码,如果审核通过,jgm/pandoc#4716 应该就不用这个了。接近解决,就是没有时间写那个代码,以后再说吧。

@qinglee
Copy link
Member

qinglee commented Sep 26, 2018

xeCJK 的补丁使用了 \scantokens 来改变命令参数中的 \lstinline 的参数字符的 \catcode,然而参数记号 # 在传递过程中会双写,导致这个问题。listings 包在这里是使用传统的 \lowercase 技巧,可以避免这个问题。

目前,一个回避问题的方法是像对{}和空格这些特殊记号一样,用 \ 转义:

\passthrough{\lstinline!\#!}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants