我想强调一种格式化语言的结构,它使用的标签与 HTML 有些相似,但在结束标签方面具有不同的功能。我在想这样的事情:
在不借助其他图形软件的情况下,我有什么办法可以绘制出解释结构的括号?
(我正在使用 pdflatex...)
答案1
更新
TikZ 解决方案。
该实现依赖于一对命令\open
和\close
(对于 HTML 语法,以及\openvar
,\closevar
对于其他语法)。命令定义如下:
\newcommand\open[1]{
\tikz[remember picture,baseline=(open#1.base)]{\node(open#1){<#1>};}
}
\newcommand\close[3][red]{
\tikz[remember picture,baseline=(close#2.base)]{
\node(close#2){</#2>};
\draw[#1,overlay](open#2)to[ncbar=#3](close#2);
}
}
-var
第二种语法的命令版本有类似的定义。
该\open
命令接受一个参数,即打开标签的名称。该\close
命令接受 3 个参数:
- 第一个可选参数设置连接打开和关闭标签的“括号”的颜色(默认设置为
red
); - 第二个参数是关闭标签的名称;
- 第三个参数决定“括号”的高度。请注意,括号由
ncbar
,由以下函数提供:Jake 的回答在这里。
完整代码
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
% ncbar style - https://tex.stackexchange.com/a/55069/18228
\tikzset{
ncbar angle/.initial=90,
ncbar/.style={
to path=(\tikztostart)
-- ($(\tikztostart)!#1!\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztotarget)$)
-- ($(\tikztotarget)!($(\tikztostart)!#1!\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztotarget)$)!\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztostart)$)
-- (\tikztotarget)
},
ncbar/.default=0.5cm,
}
\tikzset{every node/.style={inner sep=0pt, outer sep=0pt}} % remove unnecessary space
% HTML syntax
\newcommand\open[1]{
\tikz[remember picture,baseline=(open#1.base)]{\node(open#1){<#1>};}
}
\newcommand\close[3][red]{
\tikz[remember picture,baseline=(close#2.base)]{
\node(close#2){</#2>};
\draw[#1,overlay](open#2)to[ncbar=#3](close#2);
}
}
% second 'unknown' syntax
\newcommand\openvar[1]{
\tikz[remember picture,baseline=(open#1.base)]{\node(open#1){<\uppercase{#1}>};}
}
\newcommand\closevar[3][red]{
\tikz[remember picture,baseline=(close#2.base)]{
\node(close#2){</>};
\draw[#1,overlay](open#2)to[ncbar=#3](close#2);
}
}
\begin{document}
\ttfamily
\open{b} nur fett \open{i} fett kursiv \close[green]{b}{.5cm} nur kursiv \close{i}{.7cm}
\bigskip\bigskip
\openvar{b} nur Fett \openvar{i} fett kursiv \closevar{i}{.5cm}\closevar[green]{b}{.7cm}\openvar{i} nur kursiv \closevar{i}{.5cm}
\end{document}
更新 2
定义命令的稍微更有效的方法\close
,它只有两个参数:
\newcommand\close[2][red]{
\tikz[remember picture,baseline=(close#2.base)]{
\node(close#2){</#2>};
\draw[ncbar,#1,overlay](open#2)to(close#2);
}
}
现在它只需要两个参数:
第一个可选参数控制“括号”的线条样式。默认设置为
red
,如果未指定可选参数,则可能更改为[red,thick]
以产生红色粗线。- 还要注意,
ncbar
现在为操作提供了选项\draw
,因此默认情况下,括号的高度为.5cm
。如果需要绘制高度为 .7cm 的括号,只需使用\close[ncbar=.7cm,<other options>]{<tag name>}
。
- 还要注意,
第二个参数与以前相同:关闭标签的名称。
经过\closevar
类似修改,上述两个示例可以实现为
\open{b} nur fett \open{i} fett kursiv \close[green]{b} nur kursiv \close[red,ncbar=.7cm]{i}
和
\openvar{b} nur Fett \openvar{i} fett kursiv \closevar{i}\closevar[green,ncbar=.7cm]{b}\openvar{i} nur kursiv \closevar{i}
答案2
latex-dvips-ps2pdf
使用 PSTricks 只是为了好玩。使用或xelatex
(较慢)进行编译。
\documentclass[preview,border=24pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage{pst-node}
\begin{document}
\tt
\Rnode{A}{<tag>} contents \Rnode{B}{</tag>}
\ncbar[angle=90,arm=12pt,linecolor=red]{A}{B}
\end{document}
PDFLaTeX 版本
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{auto-pst-pdf}
\usepackage{pst-node}
\begin{document}
This is a language:
\begin{postscript}
\tt
\Rnode{A}{<tag>} contents \Rnode{B}{</tag>}
\ncbar[angle=90,arm=12pt,linecolor=red,nodesep=6pt]{A}{B}
\end{postscript}
\end{document}