Gantt-Diagramm automatisch auf Seitenbreite erweitern

Gantt-Diagramm automatisch auf Seitenbreite erweitern

Ich möchte, dass fast jedes Gantt-Diagramm passtautomatischzur Textbreite einer Seite. Das große Wort in dieser Frage istautomatischUnd darin unterscheidet sie sich von anderen Fragen dieser Art.

DerTextbreiteund dasAnzahl der Zeitfensterim Diagramm nicht angegeben sind. Die Lösung sollte flexibel genug sein, um dies zu berücksichtigen.

Vielleicht gibt es eine Lösung fürBerechnung x unit? Das MWE unten hat 122 Zeitschlitze. Ich würde also x unitauf einstellen \textwidth divided by 122. Gibt es eine Möglichkeit, das zu tun?

\documentclass{article}
\usepackage[showframe]{geometry} % show page borders
\usepackage{pgfgantt}

\begin{document}
\noindent
\begin{ganttchart}
    [
        x unit=1.23mm,              % timeslot width
        time slot format=isodate    % Datumsformat
    ]
    {2017-04-01}{2017-07-31}        % from-to (122 days)

    \gantttitle{Gantt-Chart with 122 timeslots}{122}\\
    \ganttbar{Short}{2017-05-01}{2017-06-01}\\
    \ganttbar{Long Long}{2017-05-25}{2017-06-04}\\
\end{ganttchart}
\end{document}

Antwort1

Nach der Diskussion im Chat ist dies eine Anpassung von Alans Antwort, die die Syntax implementiert, die er realisieren wollte.

% addaswyd o ateb Alan Munn: https://tex.stackexchange.com/questions/364944/expand-a-gantt-chart-automatically-to-textwidth-of-a-page/364969#364969 a chwestiwn buhtz: https://tex.stackexchange.com/questions/364944/expand-a-gantt-chart-automatically-to-textwidth-of-a-page
\documentclass[a4paper]{article}
\usepackage[showframe]{geometry} % show page borders
\parindent=0pt
\usepackage{pgfgantt}
\makeatletter
\tikzset{%
  /pgfgantt/time slots/.code={%
    \tikzset{%
      /pgfgantt/time slots/.cd,
      #1,
      /pgfgantt/.cd,
    }%
  },
  /pgfgantt/time slots/.search also={/pgfgantt},
  /pgfgantt/time slots/.cd,
  width/.store in=\ts@width,
  width=\textwidth,
  slots/.store in=\totaltimeslots,
  slots=20,
  label width/.store in=\ts@labelwidth,
  label width=25mm,
  calc x unit/.code n args=3{%
    \pgfmathsetmacro\ts@xunit{(#1-#2-0.6667em-2*\pgflinewidth)/#3}%
    \tikzset{%
      /pgfgantt/x unit=\ts@xunit pt,
    }%
  },
  widest/.code={%
    \pgfmathsetmacro\ts@wdlabel{width("#1")}%
    \tikzset{/pgfgantt/time slots/label width=\ts@wdlabel pt}%
  },
  calc x unit aux width/.style={/pgfgantt/time slots/calc x unit={#1}{\ts@labelwidth}{\totaltimeslots}},
  calc x unit aux label width/.style={/pgfgantt/time slots/calc x unit={\ts@width}{#1}{\totaltimeslots}},
  calc x unit aux slots/.style={/pgfgantt/time slots/calc x unit={\ts@width}{\ts@labelwidth}{#1}},
  width/.forward to=/pgfgantt/time slots/calc x unit aux width,
  slots/.forward to=/pgfgantt/time slots/calc x unit aux slots,
  label width/.forward to=/pgfgantt/time slots/calc x unit aux label width,
}
\makeatother
\begin{document}
\begin{ganttchart}
    [
        time slots={slots=122, widest=Long Long},
        time slot format=isodate,
    ]
    {2017-04-01}{2017-07-31}        % from-to (122 days)

    \gantttitle{Gantt-Chart with 122 timeslots}{\totaltimeslots}\\
    \ganttbar{Short}{2017-05-01}{2017-06-01}\\
    \ganttbar{Long Long}{2017-05-25}{2017-06-04}\\
\end{ganttchart}

\begin{ganttchart}
    [
        time slots/slots=15,
        time slots/widest=Foo,
        time slots/width=.9\linewidth,
        time slot format=isodate,
    ]
    {2017-04-01}{2017-04-15}        % from-to (122 days)
    \gantttitle{Gantt-Chart with 15 timeslots}{15}\\
    \ganttbar{Foo}{2017-05-25}{2017-06-04}
\end{ganttchart}
\end{document}

Antwort2

Verwenden Sie das calcPaket, um die Länge nach Bedarf einzustellen. Da die Anzahl der Zeitschlitze im \ganttitleBefehl manuell eingestellt werden muss, habe ich einen ganttchartStil erstellt timeslots, der als Argumente die Anzahl der Schlitze für das Diagramm und den Text des längsten \gantttitleEtiketts (mit Komma getrennt) verwendet und daraus dann die Breite berechnet. Außerdem wird der Wert eines Makros eingestellt, \timeslotsdas dann im Befehl verwendet werden kann \gantttitle.

Ich habe den Code als ganttchartStil hinzugefügt, damit er wie in der vorherigen Version ohne eigenes Makro angegeben werden kann (Details finden Sie im Bearbeitungsverlauf). Ich habe auch eine Länge für die Breite hinzugefügt, auf die sich die automatische Größenanpassung beziehen soll. Für Ihr spezielles Beispiel ist sie auf eingestellt \textwidth, aber so können Sie sie auf jede beliebige Breite einstellen.

Verwendung:[ ..., timeslots={<number>,<text of longest label>}, ... ]

\usepackage[]{geometry} % show page borders
\parindent=0pt
\usepackage{pgfgantt}
\usepackage{calc}
\newlength{\myunitx}
\newlength{\autosizewidth}
\setlength{\autosizewidth}{\textwidth} % this allows you to change the value for autosizing
\newcommand*{\timeslots}{}
\ganttset{
timeslots/.code args={#1,#2}{\setlength{\myunitx}{(\autosizewidth-\widthof{#2}-1em)/#1}
                 \renewcommand{\timeslots}{#1}\pgfkeys{pgfgantt/x unit=\myunitx}}
}
\begin{document}

\begin{ganttchart}
    [
        timeslots={122,Long Long},  % timeslots
        time slot format=isodate    % Datumsformat
    ]
    {2017-04-01}{2017-07-31}        % from-to (122 days)

    \gantttitle{Gantt-Chart with 122 timeslots}{\timeslots}\\
    \ganttbar{Short}{2017-05-01}{2017-06-01}\\
    \ganttbar{Long Long}{2017-05-25}{2017-06-04}\\
    \end{ganttchart}

\begin{ganttchart}
    [
        timeslots={15,Foo},         % timeslots
        time slot format=isodate    % Datumsformat
    ]
    {2017-04-01}{2017-04-15}        % from-to (122 days)
    \gantttitle{Gantt-Chart with 15 timeslots}{15}\\
    \ganttbar{Foo}{2017-05-25}{2017-06-04}
\end{ganttchart}
\end{document}

Ausgabe des Codes

verwandte Informationen