docs: function (additionalOptions) {
  		var chart = this,
  			chartCopy,
  			sandbox,
  			svg,
  			seriesOptions,
  			sourceWidth,
  			sourceHeight,
  			cssWidth,
  			cssHeight,
  			options = merge(chart.options, additionalOptions); // copy the options and add extra options
  
  		// IE compatibility hack for generating SVG content that it doesn't really understand
  		if (!doc.createElementNS) {
  			/*jslint unparam: true*//* allow unused parameter ns in function below */
  			doc.createElementNS = function (ns, tagName) {
  				return doc.createElement(tagName);
  			};
  			/*jslint unparam: false*/
  		}
  
  		// create a sandbox where a new chart will be generated
  		sandbox = createElement(DIV, null, {
  			position: ABSOLUTE,
  			top: '-9999em',
  			width: chart.chartWidth + PX,
  			height: chart.chartHeight + PX
  		}, doc.body);
  
  		// get the source size
  		cssWidth = chart.renderTo.style.width;
  		cssHeight = chart.renderTo.style.height;
  		sourceWidth = options.exporting.sourceWidth ||
  			options.chart.width ||
  			(/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||
  			600;
  		sourceHeight = options.exporting.sourceHeight ||
  			options.chart.height ||
  			(/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||
  			400;
  
  		// override some options
  		extend(options.chart, {
  			animation: false,
  			renderTo: sandbox,
  			forExport: true,
  			width: sourceWidth,
  			height: sourceHeight
  		});
  		options.exporting.enabled = false; // hide buttons in print
  		delete options.data; // #3004
  
  		// prepare for replicating the chart
  		options.series = [];
  		each(chart.series, function (serie) {
  			seriesOptions = merge(serie.options, {
  				animation: false, // turn off animation
  				enableMouseTracking: false,
  				showCheckbox: false,
  				visible: serie.visible
  			});
  
  			if (!seriesOptions.isInternal) { // used for the navigator series that has its own option set
  				options.series.push(seriesOptions);
  			}
  		});
  
  		// Axis options must be merged in one by one, since it may be an array or an object (#2022, #3900)
  		if (additionalOptions) {
  			each(['xAxis', 'yAxis'], function (axisType) {
  				each(splat(additionalOptions[axisType]), function (axisOptions, i) {
  					options[axisType][i] = merge(options[axisType][i], axisOptions);
  				});
  			});
  		}
  
  		// generate the chart copy
  		chartCopy = new Highcharts.Chart(options, chart.callback);
  
  		// reflect axis extremes in the export
  		each(['xAxis', 'yAxis'], function (axisType) {
  			each(chart[axisType], function (axis, i) {
  				var axisCopy = chartCopy[axisType][i],
  					extremes = axis.getExtremes(),
  					userMin = extremes.userMin,
  					userMax = extremes.userMax;
  
  				if (axisCopy && (userMin !== UNDEFINED || userMax !== UNDEFINED)) {
  					axisCopy.setExtremes(userMin, userMax, true, false);
  				}
  			});
  		});
  
  		// get the SVG from the container's innerHTML
  		svg = chartCopy.container.innerHTML;
  
  		// free up memory
  		options = null;
  		chartCopy.destroy();
  		discardElement(sandbox);
  
  		// sanitize
  		svg = this.sanitizeSVG(svg);
  
  		// IE9 beta bugs with innerHTML. Test again with final IE9.
  		svg = svg.replace(/(url\(#highcharts-[0-9]+)&quot;/g, '$1')
  			.replace(/&quot;/g, "'");
  
  		return svg;
  	}