维恩图和模式

维恩图和模式

作为一名教师,我非常感激venndiagram 使用包及其功能。有没有办法用图案而不是纯色来填充集合(以便更好地打印)?类似于\begin{venndiagram2sets}[shade={pattern=horizontal lines}]或 的东西\begin{venndiagram2sets}[tikzoptions={pattern=horizontal lines}]

以下是没有图案填充的工作示例。提前致谢!

\documentclass{standalone}
\usepackage{tikz}
   \usetikzlibrary{patterns}
\usepackage{venndiagram}
%
\begin{document}
\begin{venndiagram2sets}[shade=orange,tikzoptions={red}]
   \fillA
\end{venndiagram2sets}
\end{document}

答案1

我同意 marmot 的评论,即最好的选择是使包更灵活(我的建议是用fill=\@venn@shade类似 的东西替换every venn region/.try)。与此同时,这里有一个修复程序,它使用范围向路径添加额外的选项。

\documentclass{article}
%\url{https://tex.stackexchange.com/q/446941/86}
\usepackage{tikz}
   \usetikzlibrary{patterns}
\usepackage{venndiagram}
%
\begin{document}
\begin{venndiagram2sets}[shade={},tikzoptions={red}]
\begin{scope}[every path/.append style={pattern=north east lines}]
\fillA
\end{scope}
\end{venndiagram2sets}

\end{document}

shade={}重要。它启用填充(因为代码中shade=<colour>变为fill=<colour>),但没有指定颜色。这里的重点是every path检查样式第一的因此,放置shade=<actual colour>将覆盖模式,而shade=none放置将禁用模式。仅shade={}启用模式而不覆盖它。

图案维恩图


更新 2018-08-22

由于裁剪的工作方式,处理交叉区域变得有点棘手。以下肯定属于有点黑客,但它似乎确实有效。它会将一些代码附加到clip命令中,从而删除选项并关闭任何其他选项。我思考这处理了将选项传递到剪切路径时可能出现的所有问题。

我还添加了一个辅助命令,将维恩图命令包装在范围内,以便该技术能够发挥作用。

\documentclass{article}
%\url{https://tex.stackexchange.com/q/446941/86}
\usepackage{tikz}
   \usetikzlibrary{patterns}
\usepackage{venndiagram}
%

\newcommand*\wrapscope[1]{%
  \expandafter\newcommand\csname o#1\endcsname[1][]{%
    \begin{scope}[##1]
    \csname #1\endcsname
    \end{scope}
  }%
}%

\wrapscope{fillA}
\wrapscope{fillACapB}

\makeatletter
\tikzset{
  clip/.append code={%
    \let\tikz@options=\pgfutil@empty
    \tikz@addmode\tikz@mode@fillfalse%
    \tikz@addmode\tikz@mode@drawfalse%
    \tikz@addmode\tikz@mode@doublefalse%
    \tikz@addmode\tikz@mode@boundaryfalse%
    \tikz@addmode\tikz@mode@fade@pathfalse%
    \tikz@addmode\tikz@mode@fade@scopefalse%
  }
}
\makeatother

\begin{document}
\begin{venndiagram2sets}[shade={},tikzoptions={red}]
%\ofillA[every path/.append style={pattern=north east lines}]
\ofillACapB[every path/.append style={pattern=north east lines}]
\end{venndiagram2sets}

\end{document}

答案2

类似这样的(这只是一个粗略的提议):

\documentclass[border=5pt,tikz]{standalone}
   \usetikzlibrary{patterns}
%\usepackage{venndiagram}
%
\begin{document}
%\begin{venndiagram2sets}[shade=orange,tikzoptions={red}]
%   \fillA
%\end{venndiagram2sets}
\begin{tikzpicture}[red,every node/.style={font=\Large}]
    \draw[pattern=north west lines] (0,0) circle(1.5);
    \draw (2,0) circle(1.5);
        \node[fill=white,inner sep=1pt,rounded corners,below=3] at (90:1.5) {$A$};
        \node[xshift=2cm,below=3] at (90:1.5) {$B$};
\end{tikzpicture}
\end{document}

输出:

截屏

编辑:以下是带有水平线的提案(手工绘制的图案——只是为了好玩):

\documentclass[border=5pt,tikz]{standalone}
   \usetikzlibrary{patterns}
%\usepackage{venndiagram}
%
\begin{document}
%\begin{venndiagram2sets}[shade=orange,tikzoptions={red}]
%   \fillA
%\end{venndiagram2sets}
\begin{tikzpicture}[red,every node/.style={font=\Large}]
\begin{scope}
    \clip (0,0) circle(1.5);
    \foreach \x in {-5,-4.95,...,6}
    {
        \draw[black,yshift=\x cm] (-5,\x) -- (5,\x);
    }
\end{scope}
    \draw (2,0) circle(1.5);
    \draw (0,0) circle(1.5);
        \node[fill=white,inner sep=1pt,rounded corners,below=3] at (90:1.5) {$A$};
        \node[xshift=2cm,below=3] at (90:1.5) {$B$};
\end{tikzpicture}
\end{document}

输出如下:

截屏

相关内容