Export to EPS for LaTeX

Exports a graph, sub-graph, or layout to an encapsulated postscript (EPS) file that LaTeX can read by exporting to EPS (SavePICT), then stripping out the part of the header that starts before "%%BoundingBox". The function "ExportEPS" does the work, and ExportEPS_GUI provides a graphical interface.

// GUI for ExportEPS.  Supports everything ExportEPS does, except it doesn't do sub-windows.
Function ExportEPS_GUI()
    NewDataFolder/O root:Utilities
    NewDataFolder/O root:Utilities:ExportEPS
    // Load defaults
    Variable WidthCM = NumVarOrDefault("root:Utilities:ExportEPS:V_WidthCM",NaN)
    Variable HeightCM = NumVarOrDefault("root:Utilities:ExportEPS:V_HeightCM",NaN)
    String GraphName = StrVarOrDefault("root:Utilities:ExportEPS:S_GraphName","")
    String WdwList =  "_TOP GRAPH or LAYOUT_;"+SortList(WinList("*",";","WIN:1"),";",16) + SortList(WinList("*",";","WIN:4"),";",16)
    Variable WhichGraph =WhichListItem(GraphName,WdwList)
    if (WhichGraph<0)
        WhichGraph = 0
    Prompt WhichGraph,"Graph or Layout to Export",popup,WdwList
    Prompt WidthCM,"Exported width (cm)  (NaN to preserve aspect ratio and set height)"
    Prompt HeightCM,"Exported height (cm)  (NaN to preserve aspect ratio and set width)"
    DoPrompt "Export Graph to EPS",WhichGraph,WidthCM,HeightCM
    if (V_Flag)
        return 1 // user canceled
    // Set defaults
    GraphName = StringFromList(WhichGraph,WdwList)
    String/G root:Utilities:ExportEPS:S_GraphName = GraphName
    Variable/G root:Utilities:ExportEPS:V_WidthCM = WidthCM
    Variable/G root:Utilities:ExportEPS:V_HeightCM = HeightCM
    if (WhichGraph==0) // top graph
        GraphName = ""
    return ExportEPS(GraphName,WidthCM=WidthCM,HeightCM=HeightCM)

// Exports a graph or layout into an EPS file that LaTeX can use.
// Set GraphName to "" to select the top graph or layout.
//   Subwindows are also supported (but not sub-subwindows).
// If both WidthCM and/or HeightCM are specified and valid, they will be used to set
//   the width and height of the exported figure. (And if only one is given and valid, the
//   other will be calculated so as to preserve the aspect ratio.)
//   If neither is specified (and valid), the graph is used to set the size.
// If sub-windows are available but unspecified, the user will be prompted whether to
//   choose a sub-window or the host window -- unless DisableSubWinPrompt is true.
Function ExportEPS(GraphName,[WidthCM,HeightCM,DisableSubWinPrompt])
    String GraphName
    Variable WidthCM,HeightCM // in centimeters
    Variable DisableSubWinPrompt // option do disable prompt for sub-window (occurs if child windows present)
    if (ParamIsDefault(DisableSubWinPrompt))
        DisableSubWinPrompt = 0
    Variable SpecifiedWidth = ( !ParamIsDefault(WidthCM) && WidthCM>0 )
    Variable SpecifiedHeight = ( !ParamIsDefault(HeightCM) && HeightCM>0 )
    Variable SizeSpecified = SpecifiedWidth || SpecifiedHeight

    // Pick graph
    String GraphList = SortList(WinList("*",";","WIN:1"),";",16)
    String LayoutList = SortList(WinList("*",";","WIN:4"),";",16)
    String WdwList = GraphList+LayoutList
    if (strlen(GraphName)==0) // top graph or layout
        GraphName = WinName(0,5)
        if (strlen(GraphName)==0)
            return 2 // no graphs / layouts present
        Variable PoundLoc = strsearch(GraphName,"#",0)
        String HostName = SelectString( PoundLoc >=0,GraphName,GraphName[0,PoundLoc-1])
        Variable PromptForGraph = 0
        if (WhichListItem(HostName,WdwList)<0) // graph doesn't exist!
            PromptForGraph = 1
        elseif (PoundLoc >=0) // sub-window specified.... does it exist?
            String SubWindow = GraphName[PoundLoc+1,strlen(GraphName)-1]
            String ChildList = ChildWindowList(HostName)
            if (WhichListItem(SubWindow,ChildList)<0)
                PromptForGraph = 2 // DisableSubWinPrompt doesn't apply here, because user attempted to specify a sub-window that doesn't exist.
        if (PromptForGraph>0) // graph or subwindow doesn't exist
            String PopupList = SelectString(PromptForGraph==1,ChildList,WdwList)
            String PromptMsg = "Select "+SelectString(PromptForGraph==1,"subwindow of "+HostName,"graph or layout")+" to export"
            Variable WhichGraph = 0
            Prompt WhichGraph,PromptMsg,popup, PopupList
            DoPrompt "Export EPS", WhichGraph
            if (V_Flag)
                return 1 // user canceled
            GraphName = SelectString(PromptForGraph==1,HostName+"#","")+StringFromList(WhichGraph,PopupList)
            if (strlen(GraphName)==0) // no graphs
                return 2
    // If GraphName doesn't specify a sub-window and there are sub-windows available, ask
    // (but only if PromptForGraph!=2, in which case user didn't already select a subwindow,
    // and only if DisableSubWinPrompt is false)
    if (PromptForGraph!=2 && !DisableSubWinPrompt)
        PoundLoc = strsearch(GraphName,"#",0)
        if (PoundLoc<0) // no sub-window specified
            ChildList = SortList(ChildWindowList(HostName),";",16)
            if (strlen(ChildList)>0) // has subwindows available
                WhichGraph = 1
                Prompt WhichGraph,"Select main window or sub-window to export",popup,"HOST WINDOW;"+ChildList
                DoPrompt "Export EPS", WhichGraph
                if (V_Flag)
                    return 1 // user canceled
                GraphName += SelectString(WhichGraph==0,"#"+StringFromList(WhichGraph-1,ChildList),"")
    String FileName = GraphName+".eps"
    // Ask for file name / path
    Variable refNum
    Open/D/T=".eps"/M="Export graph to EPS figure" refNum as FileName
    String OutputFilePath = S_fileName
    if (strlen(OutputFilePath)==0)
        return 1 // user canceled

    // Set height or width according to aspect ratio, if only one quantity is specified
    if (SizeSpecified && !(SpecifiedWidth && SpecifiedHeight))
        GetWindow $GraphName, gsize // works for host or sub-windows
        Variable AspectRatio = (V_Right - V_Left) /  (V_bottom - V_Top) // width / height
        if (SpecifiedWidth)
            HeightCM = WidthCM / AspectRatio
            WidthCM = HeightCM * AspectRatio

    // ---- Write to temporary file, then read contents ----
    // (Code from Howard Rodstein 3/7/13)
    String pathToTemp = SpecialDirPath("Temporary", 0, 0, 0)
    String fullPath = pathToTemp + "TempEPSForLatexWork.eps"
    if (SizeSpecified)
        SavePICT/O/EF=1/E=-3/M/W=(0,0,WidthCM,HeightCM)/WIN=$GraphName as fullPath
        SavePICT/O/EF=1/E=-3/WIN=$GraphName as fullPath
    // Get binary file contents
    Open/R refNum as fullPath
    FStatus refNum
    Variable numBytes = V_logEOF
    String EPScontents = PadString("", numBytes, 32)
    FBinRead refNum, EPScontents
    Close refNum
    DeleteFile /Z fullPath
    // --------------------------------------------------------------------------
    // Remove stuff before "%%BoundingBox"
    Variable iLoc = strsearch(EPScontents,"%%BoundingBox",0)
    if (iLoc>=0)
        EPScontents = EPScontents[iLoc-1,strlen(EPScontents)-1]
        DoAlert 0, "Export EPS error: Location of \"%%BoundingBox\" not found."
        return 3
    // Write the file
    Open refNum as OutputFilePath
    FBinWrite refNum, EPScontents // write the EPS file
    Close refNum
    String sWdwType = SelectString (WinType(GraphName)==1,"Layout","Graph")
    print sWdwType+" \""+GraphName+"\" written to "+OutputFilePath
    return 0 // no error
A suggestion here is to use the standard Packages folder and set a DFREF ...

Function ExportEPS_GUI()

    NewDataFolder/O root:Packages
    NewDataFolder/O root:Packages:ExportEPS

    GraphName = StringFromList(WhichGraph,WdwList)
        DFREF XEPS = root: Packages:ExportEPS
    String/G XEPS:S_GraphName = GraphName
    Variable/G XEPS:V_WidthCM = WidthCM
    Variable/G XEPS:V_HeightCM = HeightCM

J. J. Weimer
Chemistry / Chemical & Materials Engineering, UAHuntsville




Igor Pro 8

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More