如何绘制标记语言结构?

如何绘制标记语言结构?

我想强调一种格式化语言的结构,它使用的标签与 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 个参数:

  1. 第一个可选参数设置连接打开和关闭标签的“括号”的颜色(默认设置为red);
  2. 第二个参数是关闭标签的名称;
  3. 第三个参数决定“括号”的高度。请注意,括号由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);
    }
}

现在它只需要两个参数:

  1. 第一个可选参数控制“括号”的线条样式。默认设置为red,如果未指定可选参数,则可能更改为[red,thick]以产生红色粗线。

    • 还要注意,ncbar现在为操作提供了选项\draw,因此默认情况下,括号的高度为.5cm。如果需要绘制高度为 .7cm 的括号,只需使用\close[ncbar=.7cm,<other options>]{<tag name>}
  2. 第二个参数与以前相同:关闭标签的名称。

经过\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}

在此处输入图片描述

相关内容