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 unit
auf 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 calc
Paket, um die Länge nach Bedarf einzustellen. Da die Anzahl der Zeitschlitze im \ganttitle
Befehl manuell eingestellt werden muss, habe ich einen ganttchart
Stil erstellt timeslots
, der als Argumente die Anzahl der Schlitze für das Diagramm und den Text des längsten \gantttitle
Etiketts (mit Komma getrennt) verwendet und daraus dann die Breite berechnet. Außerdem wird der Wert eines Makros eingestellt, \timeslots
das dann im Befehl verwendet werden kann \gantttitle
.
Ich habe den Code als ganttchart
Stil 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}