2011年7月27日水曜日

失敗ログ その1

古旗本に載っている「空のテキストフレームを削除する」は難しすぎて理解できなかったので、骨子部分を抜き出して自分なりに肉付けする履歴。

if構文はif (条件) {処理}で成立している。
選択した空テキストフレームは↓で削除できる。
var selObj = app. activeDocument. selection [0] ;
if (selObj. contents == "")
{
selObj. remove() ;
};

選択した3つのテキストフレームの中に空白テキストフレームがある場合、↓で処理される。
var selObj = app. activeDocument. selection [0] ;
if (selObj. contents == "")
{
selObj. remove() ;
};

selObj = app. activeDocument. selection[1];
if (selObj. contents == "")
{
selObj. remove() ;
};

selObj = app. activeDocument. selection[2];
if (selObj. contents == "")
{
selObj. remove() ;
};
原始的な力技だがselection[100]まで作って置けば実際の仕事で使えるかも知れない。急いで対応しなければならない時に慣れないfunctionやforで時間を費やすよりこちらの方が初心者にはいいかもしれない。とはいえ自分の勉強のためにfunction成立の流れで作ってみる。

流れ1
selObj = app. activeDocument. selection [0];
kara();
selObj = app. activeDocument. selection [1];
kara();
selObj = app. activeDocument. selection [2];
kara();

function kara (){
if (selObj. contents == "")
{
selObj. remove() ;
}
};

流れ2
kara(0);
kara(1);
kara(2);

function kara (No){
selObj = app. activeDocument. selection [No];
if (selObj. contents == "")
{
selObj. remove(No) ;
}
};

流れ3
var selObj = app. activeDocument. selection ;
for (i =0; i<selObj. length; i++)
{
kara (i);
}

function kara (No){
if (selObj [No]. contents == "")
{
selObj [No]. remove() ;
}
};

流れ4
(function (){
var selObj = app. activeDocument. selection;
for (var i =0; i<selObj. length; i++)
{
if (selObj[i]. contents == "")
{
selObj[i]. remove() ;
}
}
})();

ここまできて気づく。
流れ3と4は選択数の制限無く処理されるものの、テキストフレームに色が付けられている空のテキストフレームを選択するとエラーになってしまう。最初の簡単な文からしてそうだ。検証が甘かった。。。

2011年7月25日月曜日

functionから(function( ){ })( ) へ

function(変数){動作処理}とは別に(function(){})()があります。これは古旗さんの「InDesign自動処理実例集」から引用しますと
各プログラム中でしようされている変数名などで共通のものがあるために、同時にサンプルプログラムを利用する際に干渉しないようにするためのものです。
初心者にとっては分かったような分からんような説明です。

(function( ){ })( ) と function( ){ }( )には 
function( ) { } が式ではなく、文として解釈されてしまう。
(function( ){ })( ) だと式になる。

var b = function() { } ()な記述も可能。
だとありますが、イマイチよく分かりません。

で、JavaScriptの先人たちのScriptを見ますと function と書いている人もいれば (function(){})() と書いている人もいます。functionと記述されたスクリプトは (function(){})() と書くこともできそうな予感。とりあえずチャレンジ。
var selObj = app. activeDocument. selection;

for (var i =0; i<selObj. length; i++)
{
KozG (i) ;
}

function KozG (No){
var tObj = app. activeDocument. selection[No];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";
}
functionとforを流れで理解するに出てくる変数の前にvarを付けてませんでしたので修正。

varははじめて登場する変数の前につける約束事です。


とりあえず適当にやってみる^^
(function (){
var selObj = app. activeDocument. selection;
for (var i =0; i<selObj. length; i++)
{
var tObj = app. activeDocument. selection[i];
{
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";
}
}
})();
げっ、動いちまったぜ。。。思ったよりも簡単なのかもしれない。


(function( ){ })( )を分解してみる。

(function( ){処理リストの取得 {処理リスト {処理}} })( )
引数や関数が苦手な自分は function ⇔ (function( ){ })( ) にすることで慣れた方がいいのかもしれない。

人様の書いたスクリプトを読んでもfunctionやforが使われていると7-8行で頭が痛くなり、それ以上読めない。webや本に載っているものはfunctionやforが使われている。前回の日記にある
//テキストフレームの最初の段落書体を小塚ゴシックに変更する
var tObj = app. activeDocument. selection[0];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";

tObj = app. activeDocument. selection[1];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";

tObj = app. activeDocument. selection[2];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";

tObj = app. activeDocument. selection[3];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";
はお目にかかったことがない。しかし、ここが原点。


要は何をしたいか(ここではtObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";)。しかし、そこに辿り付くまでにエラー処理文などが入ってくると読んでいる途中で投げ出してしまう。

思い出すとアチキが最初に作ったperlはPDFに埋め込むことの出来ないATM版Dynaフォントが使われているデータを書き出したpsにPerlでCID版Dynaに置き換えて埋め込むようにしたものだった。

で、最初はs/ATM版Dynafont名/CID版Dyna名/g;とやり、正規表現が分からなかったので100書体以上のPS書体名を書いた。上の文でいえばtObj = app. activeDocument. selection[100];まで書いたと同じ。

var tObj = app. activeDocument. selection[0];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";


が骨格、あとは肉付け。骨格をしっかり掴みさえすれば、肉付けは当人のレベルにあったやりかた(functionやforを使わない)から入ってもいいんじゃないかと思う。

2011年7月24日日曜日

functionとforを流れで理解する

functionだのforだの連続処理の成り立ちがよく理解できないまま今日に至ったアチキの復習の備忘録。←およそまともな日本語になっていないことは承知。
//テキストフレームの最初の段落書体を小塚ゴシックに変更する
tObj = app. activeDocument. selection[0];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";
ドキュメント内の複数のテキストフレームを選択しても、これだと最後に作成されたテキストフレームにのみ動作します。

選択した4つのテキストフレームの最初の段落を小塚ゴシックにしたい場合、
//テキストフレームの最初の段落書体を小塚ゴシックに変更する
tObj = app. activeDocument. selection[0];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";

tObj = app. activeDocument. selection[1];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";

tObj = app. activeDocument. selection[2];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";

tObj = app. activeDocument. selection[3];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";
これで動作します。

tObj = app. activeDocument. selection[0];の [ ] 内の数値が替わっただけなので共通部分をfunctionでまとめます。
function KozG (){
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";
}
KozGは任意名の関数。
これを実行させるにはKozG();を呼び出したい回数分書く。
tObj = app. activeDocument. selection[0];
KozG ();
tObj = app. activeDocument. selection[1];
KozG ();
tObj = app. activeDocument. selection[2];
KozG ();
tObj = app. activeDocument. selection[3];
KozG ();

function KozG (){
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";
}
しかしこれだと手間は対して変わらない。で、パラメーター(引数)を用いる。ちなみに、この引数というやつが苦手だ。
KozG ();の()内に数値を入力すると関数に数値が渡される。
KozG(0);
KozG(1);
KozG(2);

この値を受け取るためにfunction内の()を(No)、[0]を[No]にすると変数Noに渡された値が入る。
KozG(0);
KozG(1);
KozG(2);
KozG(3);

function KozG (No){
tObj = app. activeDocument. selection[No];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";
}

テキストフレーム数を調べてその数を渡すのがfor文。

for(変数名=0; 変数名<繰り返す回数; 変数名++)
{
繰り返す処理
}
ドキュメント内の全てのテキストフレームの数は
app. activeDocument. textFrames. lengthで求められます。

for (i =0; i<app. activeDocument. textFrames. length; i++)
{
KozG (i) ;
}

function KozG (No){
tObj = app. activeDocument. selection[No];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";
}
変な文だけどctrl+Aで実行するととりあえず動作する。


選択したテキストフレームの数を求めるには

selObj = app. activeDocument. selection;

for (i =0; i<selObj. length; i++)


なので
selObj = app. activeDocument. selection;

for (i =0; i<selObj. length; i++)
{
KozG (i) ;
}

function KozG (No){
tObj = app. activeDocument. selection[No];
tObj. paragraphs [0]. appliedFont = "小塚ゴシック Pro";
}
で完成^^ とりあえず今日はここまで。

2011年7月9日土曜日

データチェックの復習

久しぶりに派遣案件の紹介がありやした。仕事内容はデータチェック&修正。
2年の警備業務の間にほとんど忘れました(^^;

恐怖の白オーバープリ、ヘアライン、塗り足し、TrueTypeとType1...
他にもまだまだあったような気がしますが思い出せません。

イラレの白オーバープリはWhite Overprint Detector CS345で解決。
InDesignの白オーバープリはCS4からライブプリフライトで桶。
イラレの白オーバープリのチェックもできるからこれだけでもいいか。

で、思い出したのがQuark。昔はAppleScriptがあったのだが、ほとんどのサイトが消えている。それでも掲示板に難波さんが
tell document 1 of application "QuarkXPress 3.3 Demo" to set background trap of picture boxes whose color = "白" to knockout
を残していたのでメモ。XP環境のため検証できないのだが、弄れば4以上のバージョンの文字ボックスも含めた背景 "白"をノックアウトにしてくれそうだが、どうだろう。。。んっ? 何かメモった記憶があるな。。。と思い過去blogを見たらQuark4のクリッピングパスの続きにメモっていた。
tell application “QuarkXPress”
 tell picture boxes of pages of document 1 whose color is “白”
  set background trap to knockout
 end tell
end tell


てとこ。generic boxesなら尚良し。
picture boxesをgeneric boxesに変えればtext boxにも適用されるんだろうな。にしてもASの過去資産が消えてQuark8を使うのはかなりきついよな。


次にヘアライン
これもよくお目にかかった。というかデザイナーの方はヘアラインというものが分かってないのではないか?と思ったくらい。
ヘアラインは最小デバイスピクセルで出力機の解像度に依存します。
600dpiのプリンタの場合、ヘアラインは
1インチ(25.4mm)を600で割った数値=0.0423mm
まぁプリンタでそれなりに見えます。

しかし、このデータを印刷会社に渡しますとRIPの解像度は2400dpiなので
1インチ(25.4mm)を2400で割った数値=0.0106mm

1/100ミリです!

単位変換で確認してください。


で、以前はどうやってチェックしていたかというと、、、

目でチェックしてました。。。orz

0.1ミリと0.04ですと流石に見た目で分かりましたので(^^;;; 恥!

しかし今ではヘアラインレタッチ(version 1.3.3)でイラレとInDesignはチェックできます。まぁこれとてInDesign CS4のプリフライトプロファイル設定でチェックできるわけです。

で、またしても思い出したのがQuark。まぁPDFで修正する手もあるのだが、元データから直すのが筋。

ver4からヘアラインが出てきたから対応のAppleScriptがあるはず!と調べても消えている。寺の掲示板過去ログに難波さんの罫線の太さをいっぺんに変えるスクリプトが残っているのみ。
tell document 1 of application "QuarkXPress"
try
set ll to object reference of line boxes whose selected = true
if class of ll = list then error
on error
display dialog "選ぶラインは一本だけ" buttons "キャンセル" default
button 1
end try
set {spref, lw} to {object reference of spread 1 of page 1 of ll, width
of ll}
set {text returned:new_width} to ▲
display dialog ▲
"変更後の線幅(単位はドキュメントのデフォルト(単位は入れない、入力は
半角数字のみ))" default answer ▲
lw buttons {"キャンセル", "OK"} default button 2
set width of line boxes of spref whose width = lw to new_width
end tell

※▲は取って、一行にして欲しい部分です。


日本がダメでも海外のPubli-Script Forumsにありました(^^
tell application "QuarkXPress"
activate
if not (exists document 1) then error "No document is open."
tell document 1
set HL_Boxes to every graphic box whose box type is line box type and width is "0 pt"
repeat with i from 1 to count of HL_Boxes
set width of item i of HL_Boxes to "0.25 pt"
end repeat
end tell
end tell


TrueTypeとType1はさすがに忘れた。
TrueTypeのImpactを使われた場合、そのまま出すとType1に置き換わり、文字幅が露骨に違っていたことだけ覚えている。対処法もあったのだが忘れた。d-fontのHelveticaでも騒がれていたな。あとで調べるべ。

2011年7月1日金曜日

過去ログ7月分のまとめ

2007年7月分(5投稿)
2008年7月分(14投稿)
2009年7月分(9投稿)
2010年7月分(9投稿)

2010年7月のはてなブックマークよりいくつか

指定したファイルやフォルダのアクセス権と所有権を変更『BatChmod』

target="_blank" を使わないで新しいウィンドウでリンクを開く方法
  target="_blankは XHTML 1.1 や XHTML Basic では採用されてない

PDF互換AIの配置
  CS3ならpdf形式でトンボと裁ち落とし>裁ち落としに裁ち落とし幅を入力
  CS4だと、ファイルメニュー>ドキュメント設定で裁ち落とし幅を指定することによって、アートボード(=仕上がりサイズ)に対して付加する裁ち落とし幅を調整でき、PDF互換.ai形式にもBleedBox情報を含ませることができる

というか去年の7/5のブックマはやたらPDFトラブルのチェックが多いだけにまとめて読む。
ちなみに昨年、ダイナコムから3,676書体を収録した10周年記念パッケージが発売されたのだがトラブルは解決されたのか?

7/9のブックマはUTF-8(Mac)の NFD(Normalization Form Decomposition)に関連がある。

他にもあるけどFORCEさんから
[ISBN]バーコード添字
[JeditX]base64でエンコードされた文字列をデコードする

Leopard以降の標準アーカイブフォーマット「XAR」
  使ったことも受け取ったこともないが文字化けは大丈夫?

保存出来ない
  「PDF互換ファイルを作成」のチェックをハズして保存

OSは?ブラウザのバージョンは?といちいち聞かなくてもすむようになる『Support Details』
  凄いサービスなだけにDTPの受け渡し用にカスタマイズできないのか?
  例えばInstFontを組み込むとか。

DTPToolBox
  バーコード作成サービス、デジタル検版ソフト