5

正式なモジュールから 1 つのビューをエクスポート/印刷することに関心があります。必要に応じて、公式文書にすることができるので、独自のフロント ページと、特定のテキスト フォント、サイズ、色、および挿入された画像 (会社のシンボル、クライアントのもの) を備えた独自のヘッダーとフッター ページを持つ企業テンプレートを追加します。 )。

私が見る限り、DOORS ではヘッダーとフッターを追加して印刷できますが、画像はありません。一方、Word にテンプレートを追加してエクスポートすることは可能ですが、PDF 形式やプリンターに直接エクスポートすることはできません。

DOORS ドキュメントを外部の変更なしにクライアントに直接リリースできるようにするために、Word やその他の編集者管理なしで直接ドアによって共同ドキュメントを作成できることが重要です。

DXLスクリプトで作ることは可能ですか? または、それを作成する他のオプションはありますか?

多くのユーザーは、会社の企業イメージを印刷 (または PDF ファイルを作成) する必要があると思いますが、これは非常に役立つと思います。

よろしくお願いいたします。

よろしくお願いします、

JM

4

3 に答える 3

6

DXLスクリプトで作ることは可能ですか?

私見です。DOORS モジュールを PDF にコンパイルできる LaTeX ファイルにエクスポートする DXL スクリプトを既に作成しました。この回答の最後にあります。必要に応じて自由に調整してください。実行する前に、「スマート フォルダー ブラウザー」のソースをダウンロードし、スクリプトのほかに「smartFolderBrowser.inc」として保存する必要があります。Die extension inc は、これがインクルード ファイルであり、スタンドアロンの DXl プログラムではないことを示します。

もちろん、このようなアプローチを使用したいすべてのユーザーは、MiKTeXのような TeX ディストリビューションをインストールする必要があります。DXL スクリプトは、DXL 組み込み関数を使用して、エクスポート後に PDF ビルドを開始できますvoid system(string command)

カスタム DXL LaTeX エクスポート スクリプトを使用すると、結果の PDF のレイアウトを完全に制御する必要があります。ただし、TeX が適用するレイアウト規則に注意してください。M$ Word で作成されたドキュメントをレンダリングするように TeX を構成 (強制) するのは、非常に困難なタスクになる可能性があります。

// DOORS LaTeX Export
/**
Copyright (c) 2012-2013 Kai K.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
pragma encoding, "UTF-8"


#include "smartFolderBrowser.inc"

DBE dbeOutputFolder = null;
DBE dbeOptions = null;
bool withTitles = true
Buffer tempBuf = create;

void escapeSpecialLaTeXCharacters(Buffer& str)
{
   Buffer temp = create;

   int i = 0;
   for(i = 0; i < length(str); ++i) 
   {
      char c = str[i]; 
      if( '\\' == c ) 
      {
         temp += "\\textbackslash{}";
      }
      else if( '{' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '}' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '_' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '^' == c )
      {
         temp += "\\textasciicircum{}";
      }
      else if( '#' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '&' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '$' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '%' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '~' == c )
      {
         temp += "\\textasciitilde{}";
      }
      else
      {
         temp += c;
      }
   }

   str = tempStringOf(temp);
   delete temp;
}

string makeLabel(Buffer& str)
{
   setempty(tempBuf);

   int i = 0;
   for(i = 0; i < length(str); ++i) 
   {
      char c = str[i]; 
      if( ' ' != c && '-' != c && '\n' != c && '\\' != c && '_' != c && '#' != c) 
      {
         tempBuf += c;
      }
   }
   return stringOf(tempBuf);
}

string makeCaption(Buffer& str)
{
   setempty(tempBuf);

   int i = 0;
   for(i = 0; i < length(str); ++i) 
   {
      char c = str[i]; 
      if( '\n' != c && '\\' != c) 
      {
         tempBuf += c;
      }
   }
   escapeSpecialLaTeXCharacters(tempBuf);
   return stringOf(tempBuf);
}

void rtf2latex(Buffer& buf)
{
   Buffer txt = create;
   Buffer temp = create;
   RichTextParagraph rp = null;
   bool envopened = false;
   for rp in tempStringOf(buf) do {
      if(rp.indentLevel > 0)
      {
         real hspace = realOf(rp.indentLevel)/20.0;
         temp += "{\\hangindent" hspace "pt\\hangafter0"
      }
      if(rp.isBullet)
      {
         temp += "\\textbullet ";
      }      
      RichText rt = null      
      for rt in rp do {
         txt = rt.text;         
            escapeSpecialLaTeXCharacters(txt);

         if (rt.italic)
         {
            temp += "\\textit{";
            temp += txt;
            temp += "}";
         }
         else if (rt.bold)
         {
            temp += "\\textbf{";
            temp += txt;
            temp += "}";
         }
         else if (rt.strikethru)
         {
            temp += "\\sout{";
            temp += txt;
            temp += "}";
         }
         else if (rt.subscript)
         {
            temp += "\\textsubscript{";
            temp += txt;
            temp += "}";
         }
         else if (rt.superscript)
         {
            temp += "\\textsuperscript{";
            temp += txt;
            temp += "}";
         }
         else if (rt.underline)
         {
            temp += "\\underline{";
            temp += txt;
            temp += "}";
         }         
         else
         {
            temp += txt;
         }
         if (rt.newline && !rt.last)
         {
            temp += "\\par\n";
         }
         else if(rt.last)
         {
            temp += "\n";
         }
      }
      if(rp.indentLevel > 0)
      {
         temp += "}"
      }
   }
   buf = tempStringOf(temp);
   delete temp;
   delete txt;  
}

void getObjectText(Object obj, Buffer& buf)
{  
   if(!null(obj))
   {
      buf = richTextFragment(richText(obj."Object Text"));
      rtf2latex(buf);
   }
   else
   {
      buf = "null";
      print("ERROR: obj null!: "dxlHere() "\n");
   }   
}

int nextCell(Stream& oss, int curCol, int numCols )
{
   if( curCol == numCols )
   {
      oss << "\\\\\n\\hline\n"
   }
   else
   {
      oss << "\t&\t"
   }

   return( curCol % numCols + 1 )
}

void writePreamble(Stream& oss)
{
   oss << "\\documentclass[a4paper]{book}\n";
   oss << "%---- packages ----\n";
   oss << "\\usepackage{ulem}\n";
   oss << "\\usepackage{color}\n";
   oss << "\\usepackage{graphicx}\n";
   oss << "\\usepackage{supertabular}\n";
   oss << "\\usepackage{hyperref}\n";
   oss << "\\usepackage{makeidx}\n";
   oss << "\\usepackage{xltxtra}\n";
   oss << "\\makeindex\n";
   oss << "%\n---- settings ----\n";
   oss << "\\setcounter{secnumdepth}{6}\n";
   oss << "\\setlength{\\parindent}{0}\n";
   oss << "\\setlength{\\parskip}{2x}\n";
   oss << "%\n---- customizations ----\n";
   oss << "\\makeatletter\n";
   oss << "\\def\\maxwidth{%\n";
   oss << "\\ifdim\\Gin@nat@width>\\linewidth\n";
   oss << "\\linewidth\n";
   oss << "\\else\n";
   oss << "\\Gin@nat@width\n";
   oss << "\\fi\n";
   oss << "}\n";
   oss << "\\makeatother\n";
   oss << "\n%---- document ----\n";
   oss << "\\begin{document}\n";
   oss << "\\tableofcontents\n";
   oss << "\\listoffigures\n";
   oss << "\\listoftables\n";
}

void writeTableHeader(Stream& oss, Object tableobj, int& numCols )
{
   //print("Enter: writeTableHeader\n");
   numCols = 0
   int numRows = 0;
   int tableWidth = 0;

   Object cellobj = null;
   Object rowobj = null;
   // first count the columns and rows
   for rowobj in table( tableobj ) do {
      if( !isDeleted( rowobj ) )
      {
         if(numCols == 0)
         {
            for cellobj in rowobj do {
               if( !isDeleted( cellobj ))
               {
                  tableWidth += getCellWidth(cellobj);
                  numCols++;              
               }
            }
         }
         numRows++;
      }
   }

   // extract the header row
   int colCount = numCols;
   int col = 0;   
   Object headrow[colCount];
   for rowobj in table( tableobj ) do {
      if( !isDeleted( rowobj ) )
      {
         if(col == 0)
         {
            for cellobj in rowobj do {
               if( !isDeleted( cellobj ))
               {
                  headrow[col] = cellobj;
                  col++;
               }
            }
         }
         else
         {            
            break;
         }
      }
   }

   // export the table head
   oss << "\\begin{centering}\n";

   Buffer buf = create;
   oss << "\\tablefirsthead{";   
   for(col=0; col<colCount; ++col) {
      getObjectText(headrow[col], buf);
      oss << tempStringOf(buf);
      if(col+1<colCount)
         oss << "&";
   }
   oss << "\\\\}\n";

   oss << "\\tablehead{";
   for(col=0; col<colCount; ++col) {   
      getObjectText(headrow[col], buf);
      oss << tempStringOf(buf);
      if(col+1<colCount)
         oss << "&";         
   }
   oss << "\\\\}\n";
   oss << "\\tabletail{\\hline}\n";   

   oss << "\\begin{supertabular}{|";
   for(col=0; col<colCount; ++col) {
      cellobj = headrow[col];
      int w = getCellWidth(cellobj);
      real rw = w;
      real tw = tableWidth;
      w = intOf(rw/tw*100.0);
      rw = realOf(w)/100.0;
      oss << "p{" rw "\\textwidth}|";
   }  
   oss << "}\n\\hline\n"

   delete buf;

   //print("Leave: writeTableHeader\n");
}

void writeTableFooter(Stream& oss, Buffer& objtext)
{
   oss << "\\\\\n\\hline\n"
   oss << "\\end{supertabular}\n\\label{tab:";
   oss << makeLabel( objtext );
   oss << "}\n\\bottomcaption{"
   oss << makeCaption( objtext );
   oss << "}\n\\end{centering}\n"
}

void writeobjheading(Stream& oss, Buffer &objNum, Buffer &text, int level )
{
   if(1 == level)
   {
      oss << "\\chapter{";
   }
   else if(2 == level)
   {
      oss << "\\section{";        
   }
   else if(3 == level)
   {
      oss << "\\subsection{";        
   }
   else if(4 == level)
   {
      oss << "\\subsubsection{";        
   }
   else if(5 == level)
   {
      oss << "\\paragraph{";        
   }
   else
   {
      oss << "\\subparagraph{";        
   }

   oss << tempStringOf(text);
   oss << "}\n\\label{sec:";
   oss << makeLabel(text);
   oss << makeLabel(objNum);
   oss << "}\n";
}

void writeFigureHeadAndExport(Stream& oss, Object img, string outputDir)
{
   Module mod = module(img);   
   string n = mod."Prefix"img."Absolute Number"".png";
   string s = exportPicture(img, outputDir "\\" n, formatPNG);   
   oss << "\\begin{figure}[ht]\n";
   oss << "\\centering\n";
   oss << "\\includegraphics[width=\\textwidth]{"n"}\n";
}

void writeFigureFooter(Stream& oss, Buffer& objtext)
{
   oss << "\\label{fig:";
   oss << makeLabel( objtext );
   oss << "}\n\\caption{"
   oss << makeCaption( objtext );
   oss << "}\n\\end{figure}\n";
}

void writeRequirement(Stream& oss, Module& doorsModule, Object obj, Buffer& puid, Buffer& objtext)
{
   oss << "\\textbf{";
   oss << tempStringOf( puid );
   oss << "}\\\\\n" //"PUID style"
   oss << "\\label{req:";
   oss << makeLabel(puid)
   oss << "}\n";
   oss << "\\index{";
   oss << tempStringOf( puid );
   oss << "}\n";
   oss << "\\color{blue}\n"
   oss << tempStringOf( objtext )
   oss << "\n"//"requirement style"

   oss << "\\begin{tabbing}\n"
   Column col = null;
   Buffer var_name = create;
   int c=0;   
   for col in doorsModule do {      
      var_name = title( col )
      escapeSpecialLaTeXCharacters(var_name);

      if( ! main( col ) && search( regexp "(P|p)(U|u)(I|i)(D|d)", var_name, 0 ) == false )
      {         
         oss << "\\textbf{";
         oss << var_name;
         if(c == 0)
            oss <<  "}: \\hspace{2.0cm} \\= "
         else
            oss <<  "}: \\> "

         var_name = text( col, obj );
         escapeSpecialLaTeXCharacters(var_name);
         oss << var_name;
         oss << "\\\\\n";// "attribute valueBuf" )
         c++;
      }               
   }
   oss << "\\end{tabbing}\n"
   oss << "\\color{black}\n"
   delete var_name;
}

void timeString( int timeInSeconds, Buffer &t )
{
   t = ""

   int hours, minutes, seconds

   hours    =   timeInSeconds / 3600
   minutes  = ( timeInSeconds - hours * 3600 ) / 60
   seconds  = ( timeInSeconds - hours * 3600 - minutes * 60 )

   if( hours < 10 ) t = "0"
   t += ( hours "")
   t += ":"
   if( minutes < 10 ) t += "0"
   t += ( minutes "")
   t += ":"
   if( seconds < 10 ) t += "0"
   t += ( seconds "")
}

void doExport(DB db)
{
   int startTime = intOf( today )

   int progressLimit = 0;
   Object obj = null;
   for obj in current Module do {
      progressLimit++;
   }

   progressStart(db, "Exporting Module as LaTeX", "Object 0/"progressLimit"", progressLimit);
   string outputDir = get(dbeOutputFolder);
   string outputFileName = name(current Module);
   string outputFileExt = ".tex";
   string outputFilePath = outputDir "\\" outputFileName outputFileExt;

   Stream mainFile = write(outputFilePath);
   Stream oss = mainFile;

   writePreamble(oss);

   int progress = 1;
   int curCol = 1;
   int numCols = 0;
   bool lastObjWasFigure = false;
   bool lastObjWasTable = false;

   Buffer objheading = create;
   Buffer objtext = create;
   Buffer objNum = create;
   Buffer puid = create;

   int lev = 0
   int puidLevel = 0
   Regexp excel = regexp "objclass Excel.Sheet"
   Module doorsModule = current Module;
   int subfileCount = 1;
   for obj in current Module do {
      if(progressCancelled())
      {
         if( confirm(db, "Do you really want to abort the export?") )
         {
            break;
         }
      }

      progressMessage("Object "progress"/"progressLimit"");

      getObjectText(obj, objtext)

      // ------------------- Handle Tables ------------------------------------
      if( cell( obj ))
      {
         if( !lastObjWasTable )
         {
            writeTableHeader(oss, obj, numCols);            
            curCol           = 1;
            lastObjWasTable  = true;
         }
         else
         {
            curCol = nextCell(oss, curCol, numCols );
         }
         oss << tempStringOf( objtext ); // "Standard"
         progressStep(progress);
         progress++;
         continue
      }

      // ------------------- After Table write Table Title -----------------
      if( lastObjWasTable )
      {
         writeTableFooter(oss, objtext);
      }
      // ------------------- After Figure write Figure Title ---------------
      if( lastObjWasFigure )
      {
         writeFigureFooter(oss, objtext)
      }

      objNum  = number( obj )
      objheading = obj."Object Heading"
      escapeSpecialLaTeXCharacters(objheading)

      // ------------------- Handle End of Requirement ------------------------
      lev = level( obj )
      if( lev <= puidLevel )
      {
         //oss << "End Requirement\n\n"
         puidLevel = 0
      }

      if( withTitles && ( lastObjWasTable || lastObjWasFigure ))
      {
         lastObjWasTable  = false
         lastObjWasFigure = false
         continue
      }

      // ------------------- Handle objheading with hierarchy --------------------
      if( length( objheading ) > 0 )
      {
         writeobjheading(oss, objNum, objheading, lev )
      }

      if( length( objtext ) > 0 )
      {
         // remember, if Title has to be written after this object
         if( containsOle( obj."Object Text"))
         {
            if( excel objtext ) {
               lastObjWasTable = true
            }
            else
            {
               lastObjWasFigure = true;
               writeFigureHeadAndExport(oss, obj, outputDir);
            }
         }
         // ------------------- Handle Requirements objects Text -----------
         puid = obj."IE PUID"
         escapeSpecialLaTeXCharacters(puid)
         if( length( puid ) > 0 )
         {
            puidLevel = lev
            writeRequirement(oss, doorsModule, obj, puid, objtext);
         }
         // ------------------- No PUID means normal text Object -----------
         else
         {
            oss << tempStringOf( objtext );
            oss << "\n";// "Standard"
         }
      }


      progressStep(progress);
      progress++;      
   }

   oss << "\\printindex\n"
   oss << "\\end{document}\n";

   close(oss);
   progressStop();

   // ---------------------- show the result ----------------------------------
   int endTime = intOf( today ) - startTime

   Buffer totalTime = create;
   timeString( endTime, totalTime );

   infoBox( "Export successfully finished after " totalTime "\nThe result is located in\n" outputFilePath);

   delete objheading;
   delete objtext;
   delete objNum;
   delete puid;
   delete tempBuf;
}

DB db = create("LaTeX Export");
dbeOutputFolder = smartFolderBrowser(db, "Output Folder:", false);

ok(db, doExport);
show(db);
于 2012-11-08T13:18:34.197 に答える
0

どのバージョンの DOORS を使用していますか?

DOORS 9.3+ では、IBM は RPE の機能を DOORS に組み込みました。これにより、PDF へのエクスポートなど、エクスポートのオプションが増えました。ただし、IBM Rational Publishing Engine (RPE) で独自のテンプレートを作成し、そのテンプレートを DOORS Directly 内で使用できるようになったのは、DOORS 9.4.0.1 (現在のリリース) までではありませんでした。

答えは、探しているテンプレートを作成できるように IBM から RPE Full のライセンスが 1 つ必要になるということです。そうすれば、社内で DOORS を使用する人は誰でも、そのテンプレートを使用して、追加のライセンスなしで DOORS ドキュメントをエクスポートできます。また、DOORS 9.4.0.1 を使用している必要があります。

また、ヘッダーとフッターを Word にエクスポートし、Adobe Acrobat を使用して表紙にロゴなどを追加する企業も見てきました。ただし、これは、Acrobat のフル ライセンスを持つユーザーのみがドキュメントを正しく生成できることを意味します。

RPEは間違いなくあなたの最善の策です.

幸運を。

于 2012-11-07T13:32:13.190 に答える