提问于:
浏览数:
2287
学习pgf manual.pdf。
(运行命令行:texdoc pgf,打开pgf manual.pdf。)
在阅读源代码时,查找到C:\texlive\2019\texmf-dist\doc\generic\pgf\text-en\pgfmanual-en-introduction.tex,其中第二段代码:
```tex
I wish to…… For example, the code |\tikz \draw (0pt,0pt) -- (20pt,6pt);|
```
效果为:
I wish to…… For example, the code `\tikz \draw (0pt,0pt) -- (20pt,6pt);`
用`||`夹着代码表示引用代码,但我没有作者设置的cls文件或是说明。哪个可以帮我找一下在哪里,或是如何实现的?
2 回答
3
`tikz`原文中的命令就是你在群里发的那一串代码
```tex
{
\catcode`\|=12
\gdef\pgfmanualnormalbar{|}
\catcode`\|=13
\AtBeginDocument{\gdef|{\ifmmode\pgfmanualnormalbar\else\expandafter\verb\expandafter|\fi}}
}
```
解释一下这个代码的意思,
`\catcode`用于设置字符的`分类码`(category code),所以第一句是设置`|`的分类码为12,也就是其他字符类,
然后第二句全局定义了一个宏`\pgfmanualnormalbar`,这个宏展开的结果就是当前的`|`的意思,
然后第三句设置`|`的分类码为13,也就是活动字符,简单来说,此时`|`就相当于一个宏。最后一句则是在`document`环境开始时插入一段代码,这段代码是全局重定义宏`|`,如果在数学模式下,它就相当于是普通的竖线`|`,如果不是,它就相当于是`\verb|`,当再次输入一个`|`时,就刚好变成了`\verb| |`。
实际上这里并没有实现真正的`global`,真正要`global`的话,代码如下
```tex
\documentclass{article}
{
\global\catcode`\|=12
\gdef\pgfmanualnormalbar{|}
\global\catcode`\|=13
\AtBeginDocument{\gdef|{\ifmmode\pgfmanualnormalbar\else\expandafter\verb\expandafter|\fi}}
}
\begin{document}
|\tikz \draw (0pt,0pt) -- (20pt,6pt);|
\[|aaa|\]
\end{document}
```
`\expandafter`这种命令确实太黑科技了,我反正自己写的话写不出来
-
回复 undefined :大概懂了,谢谢 – sikouhjw 2020-04-03 00:29 回复
-
对原书的代码解答的非常详细,并给出了用法。看源代码时,没有读懂。多谢解释。 – skysea575 2020-04-02 08:52 回复
-
回复 undefined :效果使得\verb先展开为自己,先展开得到\verb的参数之后再展开\verb,否则直接按顺序展开就会出错 – 合肥-Renascence_5.1 2020-04-02 08:49 回复
-
回复 undefined :\expandafter<toks1><toks2>顾名思义就是展开<toks2>以后再展开<toks1>,这里就是暂时性的 – 合肥-Renascence_5.1 2020-04-02 08:48 回复
-
\expandafter\verb\expandafter| 中的 \expandafter| 作用是啥,看不太懂这里 – sikouhjw 2020-04-02 08:22 回复
0
自定义方法是
```tex
\documentclass{article}
\usepackage{expl3}
\usepackage{fancyvrb}
\ExplSyntaxOn
% 允许使用 |...| 作为行内抄录
\AtBeginDocument
{ \DefineShortVerb { \| } }
\AtEndDocument
{ \UndefineShortVerb { \| } }
% 公式中仍会用到(vl = vertical line)
\cs_set_eq:NN \vl |
\ExplSyntaxOff
\begin{document}
hello world |\usepackage{tikz}|
\end{document}
```
主要就是借助 `fancyvrb` 包。
以上代码是从别处抄来的。
你的回答
请登录后回答
你的回答将会帮助更多人,请务必认真回答问题。