Transform Shape не работает - TikZ

Transform Shape не работает - TikZ

Я пытаюсь масштабировать всю картинку, но ничего не получается.

\begin{tikzpicture} [scale=0.5, every node/.style={transform shape}]

\tikzstyle{startstop}   = [ellipse,   draw=orange, thick, fill=orange!20, text width=5em, minimum height=4em, text centered, dashed]
\tikzstyle{block}       = [rectangle, draw=blue,   thick, fill=blue!20,   text width=8em, minimum height=4em, shape aspect=2, text centered, rounded corners]

    % Define nodes in a matrix
    \matrix [column sep=10mm, row sep=7mm]
            {
                \node   [startstop]     (Signal)        {Trama de la señal};
                &\node  [block]         (DFT)           {Transformada Discreta de Fourier};
                &\node  [block]         (Module)        {Módulo};
                &\node  [block]         (MelFilt)       {Filtros Mel}; \\
                \node   [startstop]     (MFCC)          {MFCC};
                &\node  [block]         (Lifter)        {Lifter};
                &\node  [block]         (IDCT)          {Transformada Discreta Inversa de Coseno};
                &\node  [block]         (Log)           {Logaritmo}; \\
            };

    \node [draw, scale=1, rectangle, dashed, thick, fit=(DFT) (Module) (Log) (Lifter) (IDCT)] {};

    % connect all nodes DFT above
    \begin{scope} [every path/.style={line, line width=1.3pt}  ]

        %Down Lines 
        \path (Signal)  --  (DFT);
        \path (DFT)     --  (Module);
        \path (Module)  --  (MelFilt);
        \path (MelFilt.south)   --  (Log.north);
        \path (Log)     --  (IDCT);
        \path (IDCT)    --  (Lifter);
        \path (Lifter)  --  (MFCC);

    \end{scope}

\end{tikzpicture}

И когда я заменяюпреобразовать формудлямасштаб=0,5, фитинг не срабатывает.

решение1

Я думаю, проблема в матрице. Как только я переключился на обычные узлы, все стало работать лучше. Я также не думаю, что матрица — подходящий инструмент здесь, поскольку она работает немного по-другому. В качестве альтернативы я бы предложил использовать библиотеку, chainsкоторая также избавит от дополнительных команд строк ниже. Наконец, вы можете удалить библиотеку fitи использовать ее calcдля рисования подходящего прямоугольника вокруг узлов (кстати, для их подгонки вам понадобилось всего два).

Конечно, теперь он лучше масштабируется!

Выход

введите описание изображения здесь

Код

\documentclass[margin=10pt]{standalone}
\usepackage{tikz}

\usetikzlibrary{shapes.geometric, chains, calc}

\tikzset{
    startstop/.style={ellipse,   draw=orange, thick, fill=orange!20, text width=5em, minimum height=4em, text centered, dashed},
    block/.style={rectangle, draw=blue,   thick, fill=blue!20,   text width=8em, minimum height=4em, shape aspect=2, text centered, rounded corners},
    links/.style={line width=1.3pt}
}

\begin{document}
\begin{tikzpicture}[scale=.5,transform shape,
    start chain=going right, node distance=1cm, auto,
    every join={line width=1.3pt},
    every node/.style={on chain, join}
    ]

% Define nodes in a matrix
\node[startstop] (Signal)  {Trama de la señal};
\node[block]     (DFT)     {Transformada Discreta de Fourier};
\node[block]     (Module)  {Módulo};
\node[block]     (MelFilt) {Filtros Mel};
\node[continue chain=going below,block] (Log) {Logaritmo};
\node[continue chain=going left, block] (IDCT) {Transformada Discreta Inversa de Coseno};
\node[continue chain=going left, block]     (Lifter)  {Lifter};
\node[continue chain=going left, startstop] (MFCC)    {MFCC};

% connect all nodes DFT above
\draw[dashed, thick, rounded corners] ($(Lifter.south west)+(-.2,-.2)$) rectangle ($(MelFilt.north east)+(.2,.2)$);

\end{tikzpicture}
\end{document}

решение2

Из руководства TikZ:

Трансформировать узлы можно, но по умолчанию преобразования не применяются к узлам. Причина в том, что обычно вы не хотите, чтобы ваш текст масштабировался или поворачивался, даже если основная графика трансформируется. Масштабирование текста — зло, вращение — немного меньше. Однако иногда вы хотите трансформировать узел, например, иногда имеет смысл повернуть узел на 90 градусов. Есть два способа добиться этого:

  1. Вы можете использовать следующий вариант:

    /tikz/преобразовать форму (нет значения)

Вызывает применение текущей «внешней» матрицы преобразования к форме. Например, если вы сказали \tikz[scale=3], а затем сказали node[transform shape] {X}, вы получите «огромный» X в своей графике.

  1. Вы можете задать параметры преобразования в списке параметров узла. Эти преобразования всегда применяются к узлу.

Так что, если возможно, избегайте масштабирования! Если вы все еще упорствуете, то сделайте это своим MWe следующим образом:

\documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{fit,matrix,shapes.geometric}

    \begin{document}
\begin{tikzpicture} [
 every node/.style = {scale=0.5, transform shape, % <-----
                      align=center, minimum height=4em},
  startstop/.style = {ellipse, draw=orange, thick, dashed, 
                      fill=orange!20, text width=5em},
      block/.style = {rectangle, draw=blue, thick, rounded corners, 
                      fill=blue!20, text width=8em}
                    ]
% Define nodes in a matrix
\matrix [column sep=10mm, row sep=7mm]
{
\node[startstop]    (Signal)   {Trama de la señal};
    &   \node  [block]         (DFT)           {Transformada Discreta de Fourier};
    &   \node  [block]         (Module)        {Módulo};
    &   \node  [block]         (MelFilt)       {Filtros Mel}; \\
\node  [startstop]  (MFCC)     {MFCC};
    &   \node  [block]         (Lifter)        {Lifter};
    &   \node  [block]         (IDCT)          {Transformada Discreta Inversa de Coseno};
    &   \node  [block]         (Log)           {Logaritmo}; \\
            };
\node[draw, dashed, thick, 
      scale=2, % <-----
      fit=(DFT) (Log)] {};
% connect all nodes DFT above
\draw[line width=1.3pt,->] 
    (Signal)  edge  (DFT)
    (DFT)     edge  (Module)
    (Module)  edge  (MelFilt)
    (MelFilt) edge  (Log)
    (Log)     edge  (IDCT)
    (IDCT)    edge  (Lifter)
    (Lifter)  edge  (MFCC);
\end{tikzpicture}
    \end{document}

Основные изменения в вашем коде обозначены <---. Другие изменения лишь немного оптимизируют ваш код и (по моему вкусу) улучшают внешний вид. Конечно, лучший внешний вид получается без масштабирования.

Как вы видите, узел, который соответствует синим узлам, масштабируется с обратной величиной масштабирования узла. Это необходимо, так как для подгонки узлов его не нужно масштабировать.

Результат:

введите описание изображения здесь

решение3

Не совсем понятно, хотите ли вы масштабировать текст. Но здесь много постов на эту тему. Для вашего примера transform canvas={scale=.5}должно сработать. Это то, что вы хотите?

Обратите внимание, что мне пришлось удалить стиль lineиз вашего файла scope, так как я не знал, откуда он взялся.

% arara: pdflatex

\documentclass{article}
\usepackage[spanish]{babel}
\usepackage{tikz}
\usetikzlibrary{shapes, fit}    

\begin{document}
\begin{tikzpicture}[%
    ,transform canvas={scale=.5}
    ,startstop/.style={%
        ,ellipse
        ,draw=orange
        ,thick
        ,fill=orange!20
        ,text width=5em
        ,minimum height=4em
        ,text centered
        ,dashed
        }
    ,block/.style={%
        ,rectangle
        ,draw=blue
        ,thick
        ,fill=blue!20
        ,text width=8em
        ,minimum height=4em
        ,shape aspect=2
        ,text centered
        ,rounded corners
        }
    ]
% Define nodes in a matrix
\matrix[column sep=10mm, row sep=7mm]
    {%
    \node   [startstop]     (Signal)        {Trama de la señal};
    &\node  [block]         (DFT)           {Transformada Discreta de Fourier};
    &\node  [block]         (Module)        {Módulo};
    &\node  [block]         (MelFilt)       {Filtros Mel}; \\
    \node   [startstop]     (MFCC)          {MFCC};
    &\node  [block]         (Lifter)        {Lifter};
    &\node  [block]         (IDCT)          {Transformada Discreta Inversa de Coseno};
    &\node  [block]         (Log)           {Logaritmo}; \\
    };
\node[draw, rectangle, dashed, thick, fit=(DFT) (Module) (Log) (Lifter) (IDCT)] {};
% connect all nodes DFT above
\begin{scope}[every path/.style={draw,line width=1.3pt}]
\path (Signal)  --  (DFT);
\path (DFT)     --  (Module);
\path (Module)  --  (MelFilt);
\path (MelFilt.south)   --  (Log.north);
\path (Log)     --  (IDCT);
\path (IDCT)    --  (Lifter);
\path (Lifter)  --  (MFCC);
\end{scope}
\end{tikzpicture}
\end{document}

Связанный контент